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/05 14:52:08 UTC

[01/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site 64bc8d859 -> f2065178e


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      if (this.testScanne

<TRUNCATED>

[26/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>

<TRUNCATED>

[30/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span cl

<TRUNCATED>

[20/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span class="sourceLineNo">1455</

<TRUNCATED>

[37/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 0423a39..534acbb 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -16,11 +16,11 @@
 <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 = "87f5b5f3411d96c31b4cb61b9a57ced22be91d1f";<a name="line.11"></a>
+<span class="sourceLineNo">011</span>  public static final String revision = "acd0d1e446c164d9c54bfb461b2d449c8d717c07";<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 = "Fri May  4 14:39:10 UTC 2018";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Sat May  5 14:43:16 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 = "9cfe3eb8d49902aafbb6d8066c40fb45";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "ad489a437d1ef798b4c0329dd68b451a";<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/f2065178/downloads.html
----------------------------------------------------------------------
diff --git a/downloads.html b/downloads.html
index 7fad404..9a2b856 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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" />
@@ -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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/export_control.html
----------------------------------------------------------------------
diff --git a/export_control.html b/export_control.html
index e0a5a62..4e37cae 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index 9fcef97..64420ab 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/integration.html
----------------------------------------------------------------------
diff --git a/integration.html b/integration.html
index f53166f..1576246 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/issue-tracking.html
----------------------------------------------------------------------
diff --git a/issue-tracking.html b/issue-tracking.html
index cf58b27..56a8126 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index 435b1e2..fb236a4 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/mail-lists.html
----------------------------------------------------------------------
diff --git a/mail-lists.html b/mail-lists.html
index 1133e92..ef39847 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/metrics.html
----------------------------------------------------------------------
diff --git a/metrics.html b/metrics.html
index 75f8027..7feaaeb 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/old_news.html
----------------------------------------------------------------------
diff --git a/old_news.html b/old_news.html
index 1cbe5ce..7561438 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/plugin-management.html
----------------------------------------------------------------------
diff --git a/plugin-management.html b/plugin-management.html
index 4edc35f..9311aa7 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index b52d0ff..2a9b1b5 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/poweredbyhbase.html
----------------------------------------------------------------------
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index 75ebd2d..66102aa 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/project-info.html
----------------------------------------------------------------------
diff --git a/project-info.html b/project-info.html
index db252c0..d57982b 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/project-reports.html
----------------------------------------------------------------------
diff --git a/project-reports.html b/project-reports.html
index c75a8fc..d452db8 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/project-summary.html
----------------------------------------------------------------------
diff --git a/project-summary.html b/project-summary.html
index 4b244e7..9f01585 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/pseudo-distributed.html
----------------------------------------------------------------------
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index f8988eb..bc7ee9d 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/replication.html
----------------------------------------------------------------------
diff --git a/replication.html b/replication.html
index 7556778..59920f5 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/resources.html
----------------------------------------------------------------------
diff --git a/resources.html b/resources.html
index 3a93a0e..66f1ada 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/source-repository.html
----------------------------------------------------------------------
diff --git a/source-repository.html b/source-repository.html
index 24c7a69..8bc164a 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/sponsors.html
----------------------------------------------------------------------
diff --git a/sponsors.html b/sponsors.html
index 35d0b14..403ba80 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/supportingprojects.html
----------------------------------------------------------------------
diff --git a/supportingprojects.html b/supportingprojects.html
index 005aa68..cb2740a 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/team-list.html
----------------------------------------------------------------------
diff --git a/team-list.html b/team-list.html
index 65b022e..b4374a9 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/testdevapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index b1e54cc..87f6c2f 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -2988,6 +2988,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PerformanceEvaluation.html#BYTES_PER_MB">BYTES_PER_MB</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/PerformanceEvaluation.TestBase.html#bytesInRemoteResultsHistogram">bytesInRemoteResultsHistogram</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#bytesInResultsHistogram">bytesInResultsHistogram</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/TestBytes.html#bytesWithOffset-byte:A-">bytesWithOffset(byte[])</a></span> - Method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/TestBytes.html" title="class in org.apache.hadoop.hbase.util">TestBytes</a></dt>
 <dd>&nbsp;</dd>
 </dl>
@@ -24843,6 +24847,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/snapshot/TestSnapshotManager.html#mfs">mfs</a></span> - Variable in class org.apache.hadoop.hbase.master.snapshot.<a href="org/apache/hadoop/hbase/master/snapshot/TestSnapshotManager.html" title="class in org.apache.hadoop.hbase.master.snapshot">TestSnapshotManager</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#millisBetweenNextHistogram">millisBetweenNextHistogram</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/AcidGuaranteesTestTool.html#millisToRun">millisToRun</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/AcidGuaranteesTestTool.html" title="class in org.apache.hadoop.hbase">AcidGuaranteesTestTool</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestReplicationSyncUpToolWithBulkLoadedData.html#mimicSyncUpAfterBulkLoad-java.util.Iterator-">mimicSyncUpAfterBulkLoad(Iterator&lt;String&gt;)</a></span> - Method in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestReplicationSyncUpToolWithBulkLoadedData.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationSyncUpToolWithBulkLoadedData</a></dt>
@@ -30982,8 +30988,6 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/AcidGuaranteesTestTool.html#QUALIFIER_NAME">QUALIFIER_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/AcidGuaranteesTestTool.html" title="class in org.apache.hadoop.hbase">AcidGuaranteesTestTool</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PerformanceEvaluation.html#QUALIFIER_NAME">QUALIFIER_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/rest/PerformanceEvaluation.html#QUALIFIER_NAME">QUALIFIER_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.rest.<a href="org/apache/hadoop/hbase/rest/PerformanceEvaluation.html" title="class in org.apache.hadoop.hbase.rest">PerformanceEvaluation</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TimestampTestBase.html#QUALIFIER_NAME">QUALIFIER_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>
@@ -31964,6 +31968,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html#RegionSplitter-org.apache.hadoop.hbase.client.Table-">RegionSplitter(Table)</a></span> - Constructor for class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.RegionSplitter.html" title="class in org.apache.hadoop.hbase.regionserver">TestEndToEndSplitTransaction.RegionSplitter</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#regionsScannedHistogram">regionsScannedHistogram</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/BaseTestHBaseFsck.html#regionStates">regionStates</a></span> - Static variable in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/BaseTestHBaseFsck.html" title="class in org.apache.hadoop.hbase.util">BaseTestHBaseFsck</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/compaction/TestMajorCompactionRequest.html#regionStoreDir">regionStoreDir</a></span> - Variable in class org.apache.hadoop.hbase.util.compaction.<a href="org/apache/hadoop/hbase/util/compaction/TestMajorCompactionRequest.html" title="class in org.apache.hadoop.hbase.util.compaction">TestMajorCompactionRequest</a></dt>
@@ -32042,6 +32048,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.html#remoteDispatch-org.apache.hadoop.hbase.ServerName-java.util.Set-">remoteDispatch(ServerName, Set&lt;RemoteProcedureDispatcher.RemoteProcedure&gt;)</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.MockRSProcedureDispatcher.html" title="class in org.apache.hadoop.hbase.master.assignment">TestAssignmentManager.MockRSProcedureDispatcher</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#remoteRpcCallsHistogram">remoteRpcCallsHistogram</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/HBaseClusterManager.RemoteShell.html#RemoteShell-java.lang.String-java.lang.String:A-java.io.File-java.util.Map-long-">RemoteShell(String, String[], File, Map&lt;String, String&gt;, long)</a></span> - Constructor for class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/HBaseClusterManager.RemoteShell.html" title="class in org.apache.hadoop.hbase">HBaseClusterManager.RemoteShell</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/HBaseClusterManager.RemoteShell.html#RemoteShell-java.lang.String-java.lang.String:A-java.io.File-java.util.Map-">RemoteShell(String, String[], File, Map&lt;String, String&gt;)</a></span> - Constructor for class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/HBaseClusterManager.RemoteShell.html" title="class in org.apache.hadoop.hbase">HBaseClusterManager.RemoteShell</a></dt>
@@ -33578,6 +33586,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestAsyncProcess.html#RPC_TIMEOUT">RPC_TIMEOUT</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestAsyncProcess.html" title="class in org.apache.hadoop.hbase.client">TestAsyncProcess</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#rpcCallsHistogram">rpcCallsHistogram</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/ipc/IntegrationTestRpcClient.SimpleClient.html#rpcClient">rpcClient</a></span> - Variable in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/IntegrationTestRpcClient.SimpleClient.html" title="class in org.apache.hadoop.hbase.ipc">IntegrationTestRpcClient.SimpleClient</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestHMasterRPCException.html#rpcClient">rpcClient</a></span> - Variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestHMasterRPCException.html" title="class in org.apache.hadoop.hbase.master">TestHMasterRPCException</a></dt>
@@ -64264,6 +64274,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALLoaderPerformanceEvaluation.html#UPDATES_PER_PROC_OPTION">UPDATES_PER_PROC_OPTION</a></span> - Static variable in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALLoaderPerformanceEvaluation.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALLoaderPerformanceEvaluation</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics(ScanMetrics)</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALLoaderPerformanceEvaluation.html#updatesPerProc">updatesPerProc</a></span> - Variable in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALLoaderPerformanceEvaluation.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALLoaderPerformanceEvaluation</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestAsyncProcess.MyAsyncRequestFutureImpl.html#updateStats-org.apache.hadoop.hbase.ServerName-java.util.Map-">updateStats(ServerName, Map&lt;byte[], MultiResponse.RegionResult&gt;)</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestAsyncProcess.MyAsyncRequestFutureImpl.html" title="class in org.apache.hadoop.hbase.client">TestAsyncProcess.MyAsyncRequestFutureImpl</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 8f3b34e..6571346 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.1869">PerformanceEvaluation.AppendTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1966">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>
@@ -232,7 +232,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase
 .html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase
 .html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1870">AppendTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html#line.1967">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.1875">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html#line.1972">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/f2065178/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 1fe88fc..5e92141 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.1323">PerformanceEvaluation.AsyncRandomReadTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1390">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>
@@ -255,7 +255,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">i
 sRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">i
 sRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1324">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.1391">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.1325">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.1392">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.1326">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.1393">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.1328">AsyncRandomReadTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1395">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.1338">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1405">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.1370">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.1440">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.1377">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.1447">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.1386">getReportingPeriod</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1456">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.1392">testTakedown</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1462">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/f2065178/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 f7274ab..5d050d6 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.1401">PerformanceEvaluation.AsyncRandomWriteTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1471">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>
@@ -220,7 +220,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result
 :A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hb
 ase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1402">AsyncRandomWriteTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html#line.1472">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.1407">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html#line.1477">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/f2065178/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 4dd5aa4..a686135 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.1438">PerformanceEvaluation.AsyncScanTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1508">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>
@@ -243,7 +243,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBas
 e.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1439">testScanner</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.client.ResultScanner <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1509">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.1440">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.1510">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.1442">AsyncScanTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1512">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.1447">onStartup</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1517">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.1454">testTakedown</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1524">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.1462">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1533">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/f2065178/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 4b5a3b5..ccf6211 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.1483">PerformanceEvaluation.AsyncSequentialReadTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1557">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>
@@ -220,7 +220,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result
 :A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hb
 ase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1484">AsyncSequentialReadTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html#line.1558">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.1489">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html#line.1563">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>


[45/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectAllVisitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectAllVisitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectAllVisitor.html
index cdd2f36..fea2b5a 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectAllVisitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectAllVisitor.html
@@ -151,2029 +151,2019 @@
 <span class="sourceLineNo">143</span>  private static final Logger LOG = LoggerFactory.getLogger(MetaTableAccessor.class);<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  private static final Logger METALOG = LoggerFactory.getLogger("org.apache.hadoop.hbase.META");<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final byte[] META_REGION_PREFIX;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  static {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    // Copy the prefix from FIRST_META_REGIONINFO into META_REGION_PREFIX.<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    // FIRST_META_REGIONINFO == 'hbase:meta,,1'.  META_REGION_PREFIX == 'hbase:meta,'<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    int len = RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName().length - 2;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    META_REGION_PREFIX = new byte [len];<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    System.arraycopy(RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName(), 0,<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      META_REGION_PREFIX, 0, len);<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>  @VisibleForTesting<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  public static final byte[] REPLICATION_PARENT_QUALIFIER = Bytes.toBytes("parent");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private static final byte ESCAPE_BYTE = (byte) 0xFF;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  private static final byte SEPARATED_BYTE = 0x00;<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>  /**<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * Lists all of the table regions currently in META.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   * Deprecated, keep there until some test use this.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @param connection what we will use<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * @param tableName table to list<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * @return Map of all user-space regions to servers<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   * @deprecated use {@link #getTableRegionsAndLocations}, region can have multiple locations<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  @Deprecated<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  public static NavigableMap&lt;RegionInfo, ServerName&gt; allTableRegions(<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      Connection connection, final TableName tableName) throws IOException {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    final NavigableMap&lt;RegionInfo, ServerName&gt; regions = new TreeMap&lt;&gt;();<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    Visitor visitor = new TableVisitorBase(tableName) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      @Override<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      public boolean visitInternal(Result result) throws IOException {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>        RegionLocations locations = getRegionLocations(result);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        if (locations == null) return true;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>          if (loc != null) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>            RegionInfo regionInfo = loc.getRegionInfo();<a name="line.182"></a>
-<span class="sourceLineNo">183</span>            regions.put(regionInfo, loc.getServerName());<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>        return true;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    };<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    scanMetaForTableRegions(connection, visitor, tableName);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    return regions;<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>  @InterfaceAudience.Private<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public enum QueryType {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    ALL(HConstants.TABLE_FAMILY, HConstants.CATALOG_FAMILY),<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    REGION(HConstants.CATALOG_FAMILY),<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    TABLE(HConstants.TABLE_FAMILY),<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    REPLICATION(HConstants.REPLICATION_BARRIER_FAMILY);<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>    private final byte[][] families;<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>    QueryType(byte[]... families) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      this.families = families;<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>    byte[][] getFamilies() {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      return this.families;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  }<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span>  /** The delimiter for meta columns for replicaIds &amp;gt; 0 */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  protected static final char META_REPLICA_ID_DELIMITER = '_';<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>  /** A regex for parsing server columns from meta. See above javadoc for meta layout */<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  private static final Pattern SERVER_COLUMN_PATTERN<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    = Pattern.compile("^server(_[0-9a-fA-F]{4})?$");<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>  ////////////////////////<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  // Reading operations //<a name="line.219"></a>
-<span class="sourceLineNo">220</span>  ////////////////////////<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.223"></a>
-<span class="sourceLineNo">224</span>   * @param connection connection we're using<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * @param visitor Visitor invoked against each row in regions family.<a name="line.225"></a>
+<span class="sourceLineNo">146</span>  @VisibleForTesting<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  public static final byte[] REPLICATION_PARENT_QUALIFIER = Bytes.toBytes("parent");<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final byte ESCAPE_BYTE = (byte) 0xFF;<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final byte SEPARATED_BYTE = 0x00;<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  /**<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * Lists all of the table regions currently in META.<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * Deprecated, keep there until some test use this.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   * @param connection what we will use<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   * @param tableName table to list<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   * @return Map of all user-space regions to servers<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   * @deprecated use {@link #getTableRegionsAndLocations}, region can have multiple locations<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   */<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  @Deprecated<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  public static NavigableMap&lt;RegionInfo, ServerName&gt; allTableRegions(<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      Connection connection, final TableName tableName) throws IOException {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    final NavigableMap&lt;RegionInfo, ServerName&gt; regions = new TreeMap&lt;&gt;();<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    Visitor visitor = new TableVisitorBase(tableName) {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      @Override<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      public boolean visitInternal(Result result) throws IOException {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        RegionLocations locations = getRegionLocations(result);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        if (locations == null) return true;<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>          if (loc != null) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>            RegionInfo regionInfo = loc.getRegionInfo();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>            regions.put(regionInfo, loc.getServerName());<a name="line.173"></a>
+<span class="sourceLineNo">174</span>          }<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>        return true;<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      }<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    };<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    scanMetaForTableRegions(connection, visitor, tableName);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    return regions;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>  @InterfaceAudience.Private<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  public enum QueryType {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    ALL(HConstants.TABLE_FAMILY, HConstants.CATALOG_FAMILY),<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    REGION(HConstants.CATALOG_FAMILY),<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    TABLE(HConstants.TABLE_FAMILY),<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    REPLICATION(HConstants.REPLICATION_BARRIER_FAMILY);<a name="line.188"></a>
+<span class="sourceLineNo">189</span><a name="line.189"></a>
+<span class="sourceLineNo">190</span>    private final byte[][] families;<a name="line.190"></a>
+<span class="sourceLineNo">191</span><a name="line.191"></a>
+<span class="sourceLineNo">192</span>    QueryType(byte[]... families) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      this.families = families;<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>    byte[][] getFamilies() {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      return this.families;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  }<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>  /** The delimiter for meta columns for replicaIds &amp;gt; 0 */<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  protected static final char META_REPLICA_ID_DELIMITER = '_';<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>  /** A regex for parsing server columns from meta. See above javadoc for meta layout */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  private static final Pattern SERVER_COLUMN_PATTERN<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    = Pattern.compile("^server(_[0-9a-fA-F]{4})?$");<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>  ////////////////////////<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  // Reading operations //<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  ////////////////////////<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>  /**<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * @param connection connection we're using<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * @param visitor Visitor invoked against each row in regions family.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   */<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  public static void fullScanRegions(Connection connection,<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      final Visitor visitor)<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      throws IOException {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    scanMeta(connection, null, null, QueryType.REGION, visitor);<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>  /**<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   * @param connection connection we're using<a name="line.225"></a>
 <span class="sourceLineNo">226</span>   */<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  public static void fullScanRegions(Connection connection,<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      final Visitor visitor)<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      throws IOException {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    scanMeta(connection, null, null, QueryType.REGION, visitor);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   * @param connection connection we're using<a name="line.235"></a>
+<span class="sourceLineNo">227</span>  public static List&lt;Result&gt; fullScanRegions(Connection connection)<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      throws IOException {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    return fullScan(connection, QueryType.REGION);<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>  /**<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for tables.<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * @param connection connection we're using<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * @param visitor Visitor invoked against each row in tables family.<a name="line.235"></a>
 <span class="sourceLineNo">236</span>   */<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  public static List&lt;Result&gt; fullScanRegions(Connection connection)<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      throws IOException {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    return fullScan(connection, QueryType.REGION);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for tables.<a name="line.243"></a>
-<span class="sourceLineNo">244</span>   * @param connection connection we're using<a name="line.244"></a>
-<span class="sourceLineNo">245</span>   * @param visitor Visitor invoked against each row in tables family.<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   */<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  public static void fullScanTables(Connection connection,<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      final Visitor visitor)<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      throws IOException {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    scanMeta(connection, null, null, QueryType.TABLE, visitor);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt;.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * @param connection connection we're using<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   * @param type scanned part of meta<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * @return List of {@link Result}<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  public static List&lt;Result&gt; fullScan(Connection connection, QueryType type)<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    throws IOException {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    CollectAllVisitor v = new CollectAllVisitor();<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    scanMeta(connection, null, null, type, v);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    return v.getResults();<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>  /**<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * Callers should call close on the returned {@link Table} instance.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * @param connection connection we're using to access Meta<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   * @return An {@link Table} for &lt;code&gt;hbase:meta&lt;/code&gt;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  public static Table getMetaHTable(final Connection connection)<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  throws IOException {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    // We used to pass whole CatalogTracker in here, now we just pass in Connection<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    if (connection == null) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      throw new NullPointerException("No connection");<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    } else if (connection.isClosed()) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      throw new IOException("connection is closed");<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    return connection.getTable(TableName.META_TABLE_NAME);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * @param t Table to use (will be closed when done).<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * @param g Get to run<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   */<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  private static Result get(final Table t, final Get g) throws IOException {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    if (t == null) return null;<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    try {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      return t.get(g);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    } finally {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      t.close();<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  /**<a name="line.295"></a>
-<span class="sourceLineNo">296</span>   * Gets the region info and assignment for the specified region.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   * @param connection connection we're using<a name="line.297"></a>
-<span class="sourceLineNo">298</span>   * @param regionName Region to lookup.<a name="line.298"></a>
-<span class="sourceLineNo">299</span>   * @return Location and RegionInfo for &lt;code&gt;regionName&lt;/code&gt;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * @deprecated use {@link #getRegionLocation(Connection, byte[])} instead<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  @Deprecated<a name="line.302"></a>
-<span class="sourceLineNo">303</span>  public static Pair&lt;RegionInfo, ServerName&gt; getRegion(Connection connection, byte [] regionName)<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    throws IOException {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    HRegionLocation location = getRegionLocation(connection, regionName);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    return location == null<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      ? null<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      : new Pair&lt;&gt;(location.getRegionInfo(), location.getServerName());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  /**<a name="line.311"></a>
-<span class="sourceLineNo">312</span>   * Returns the HRegionLocation from meta for the given region<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * @param connection connection we're using<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   * @param regionName region we're looking for<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   * @return HRegionLocation for the given region<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   */<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  public static HRegionLocation getRegionLocation(Connection connection, byte[] regionName)<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      throws IOException {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    byte[] row = regionName;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    RegionInfo parsedInfo = null;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    try {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      parsedInfo = parseRegionInfoFromRegionName(regionName);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      row = getMetaKeyForRegion(parsedInfo);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    } catch (Exception parseEx) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      // Ignore. This is used with tableName passed as regionName.<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    Get get = new Get(row);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    Result r = get(getMetaHTable(connection), get);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    RegionLocations locations = getRegionLocations(r);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    return locations == null ? null<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      : locations.getRegionLocation(parsedInfo == null ? 0 : parsedInfo.getReplicaId());<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  }<a name="line.333"></a>
-<span class="sourceLineNo">334</span><a name="line.334"></a>
-<span class="sourceLineNo">335</span>  /**<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   * Returns the HRegionLocation from meta for the given region<a name="line.336"></a>
-<span class="sourceLineNo">337</span>   * @param connection connection we're using<a name="line.337"></a>
-<span class="sourceLineNo">338</span>   * @param regionInfo region information<a name="line.338"></a>
-<span class="sourceLineNo">339</span>   * @return HRegionLocation for the given region<a name="line.339"></a>
-<span class="sourceLineNo">340</span>   */<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  public static HRegionLocation getRegionLocation(Connection connection, RegionInfo regionInfo)<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throws IOException {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    byte[] row = getMetaKeyForRegion(regionInfo);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    Get get = new Get(row);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    Result r = get(getMetaHTable(connection), get);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    return getRegionLocation(r, regionInfo, regionInfo.getReplicaId());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  }<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  /** Returns the row key to use for this regionInfo */<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  public static byte[] getMetaKeyForRegion(RegionInfo regionInfo) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    return RegionReplicaUtil.getRegionInfoForDefaultReplica(regionInfo).getRegionName();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  }<a name="line.353"></a>
-<span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>  /** Returns an HRI parsed from this regionName. Not all the fields of the HRI<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * is stored in the name, so the returned object should only be used for the fields<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   * in the regionName.<a name="line.357"></a>
-<span class="sourceLineNo">358</span>   */<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  public static RegionInfo parseRegionInfoFromRegionName(byte[] regionName) throws IOException {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    byte[][] fields = RegionInfo.parseRegionName(regionName);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    long regionId = Long.parseLong(Bytes.toString(fields[2]));<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    int replicaId = fields.length &gt; 3 ? Integer.parseInt(Bytes.toString(fields[3]), 16) : 0;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    return RegionInfoBuilder.newBuilder(TableName.valueOf(fields[0]))<a name="line.363"></a>
-<span class="sourceLineNo">364</span>              .setStartKey(fields[1])<a name="line.364"></a>
-<span class="sourceLineNo">365</span>              .setEndKey(fields[2])<a name="line.365"></a>
-<span class="sourceLineNo">366</span>              .setSplit(false)<a name="line.366"></a>
-<span class="sourceLineNo">367</span>              .setRegionId(regionId)<a name="line.367"></a>
-<span class="sourceLineNo">368</span>              .setReplicaId(replicaId)<a name="line.368"></a>
-<span class="sourceLineNo">369</span>              .build();<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>  /**<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * Gets the result in hbase:meta for the specified region.<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * @param connection connection we're using<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * @param regionName region we're looking for<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * @return result of the specified region<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   */<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public static Result getRegionResult(Connection connection,<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      byte[] regionName) throws IOException {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    Get get = new Get(regionName);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    return get(getMetaHTable(connection), get);<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>   * Get regions from the merge qualifier of the specified merged region<a name="line.386"></a>
-<span class="sourceLineNo">387</span>   * @return null if it doesn't contain merge qualifier, else two merge regions<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   */<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  @Nullable<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  public static Pair&lt;RegionInfo, RegionInfo&gt; getRegionsFromMergeQualifier(<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      Connection connection, byte[] regionName) throws IOException {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Result result = getRegionResult(connection, regionName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    RegionInfo mergeA = getRegionInfo(result, HConstants.MERGEA_QUALIFIER);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    RegionInfo mergeB = getRegionInfo(result, HConstants.MERGEB_QUALIFIER);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    if (mergeA == null &amp;&amp; mergeB == null) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      return null;<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    }<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    return new Pair&lt;&gt;(mergeA, mergeB);<a name="line.398"></a>
-<span class="sourceLineNo">399</span> }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>  /**<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * Checks if the specified table exists.  Looks at the hbase:meta table hosted on<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   * the specified server.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>   * @param connection connection we're using<a name="line.404"></a>
-<span class="sourceLineNo">405</span>   * @param tableName table to check<a name="line.405"></a>
-<span class="sourceLineNo">406</span>   * @return true if the table exists in meta, false if not<a name="line.406"></a>
-<span class="sourceLineNo">407</span>   */<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public static boolean tableExists(Connection connection,<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      final TableName tableName)<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  throws IOException {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // Catalog tables always exist.<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return tableName.equals(TableName.META_TABLE_NAME)<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        || getTableState(connection, tableName) != null;<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>   * Lists all of the regions currently in META.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   *<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   * @param connection to connect with<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   * @param excludeOfflinedSplitParents False if we are to include offlined/splitparents regions,<a name="line.420"></a>
-<span class="sourceLineNo">421</span>   *                                    true and we'll leave out offlined regions from returned list<a name="line.421"></a>
-<span class="sourceLineNo">422</span>   * @return List of all user-space regions.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   */<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  @VisibleForTesting<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  public static List&lt;RegionInfo&gt; getAllRegions(Connection connection,<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      boolean excludeOfflinedSplitParents)<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      throws IOException {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result;<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>    result = getTableRegionsAndLocations(connection, null,<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        excludeOfflinedSplitParents);<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>    return getListOfRegionInfos(result);<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  /**<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * @param connection connection we're using<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * @param tableName table we're looking for<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   */<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName)<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  throws IOException {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return getTableRegions(connection, tableName, false);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  /**<a name="line.449"></a>
-<span class="sourceLineNo">450</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.450"></a>
-<span class="sourceLineNo">451</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * @param connection connection we're using<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   * @param tableName table we're looking for<a name="line.453"></a>
-<span class="sourceLineNo">454</span>   * @param excludeOfflinedSplitParents If true, do not include offlined split<a name="line.454"></a>
-<span class="sourceLineNo">455</span>   * parents in the return.<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   */<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName,<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result =<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      getTableRegionsAndLocations(connection, tableName, excludeOfflinedSplitParents);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    return getListOfRegionInfos(result);<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>  private static List&lt;RegionInfo&gt; getListOfRegionInfos(<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      final List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    if (pairs == null || pairs.isEmpty()) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      return Collections.emptyList();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    List&lt;RegionInfo&gt; result = new ArrayList&lt;&gt;(pairs.size());<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      result.add(pair.getFirst());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    return result;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  }<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>  /**<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * @param tableName table we're working with<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * @return start row for scanning META according to query type<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   */<a name="line.480"></a>
-<span class="sourceLineNo">481</span>  public static byte[] getTableStartRowForMeta(TableName tableName, QueryType type) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    if (tableName == null) {<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      return null;<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    switch (type) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    case REGION:<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      byte[] startRow = new byte[tableName.getName().length + 2];<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      System.arraycopy(tableName.getName(), 0, startRow, 0, tableName.getName().length);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      startRow[startRow.length - 2] = HConstants.DELIMITER;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      startRow[startRow.length - 1] = HConstants.DELIMITER;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      return startRow;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    case ALL:<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    case TABLE:<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    default:<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      return tableName.getName();<a name="line.495"></a>
+<span class="sourceLineNo">237</span>  public static void fullScanTables(Connection connection,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      final Visitor visitor)<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      throws IOException {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    scanMeta(connection, null, null, QueryType.TABLE, visitor);<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>  /**<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt;.<a name="line.244"></a>
+<span class="sourceLineNo">245</span>   * @param connection connection we're using<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   * @param type scanned part of meta<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * @return List of {@link Result}<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   */<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  public static List&lt;Result&gt; fullScan(Connection connection, QueryType type)<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    throws IOException {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    CollectAllVisitor v = new CollectAllVisitor();<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    scanMeta(connection, null, null, type, v);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    return v.getResults();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  /**<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * Callers should call close on the returned {@link Table} instance.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * @param connection connection we're using to access Meta<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * @return An {@link Table} for &lt;code&gt;hbase:meta&lt;/code&gt;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  public static Table getMetaHTable(final Connection connection)<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  throws IOException {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    // We used to pass whole CatalogTracker in here, now we just pass in Connection<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    if (connection == null) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      throw new NullPointerException("No connection");<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    } else if (connection.isClosed()) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      throw new IOException("connection is closed");<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    return connection.getTable(TableName.META_TABLE_NAME);<a name="line.269"></a>
+<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  /**<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * @param t Table to use (will be closed when done).<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   * @param g Get to run<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  private static Result get(final Table t, final Get g) throws IOException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    if (t == null) return null;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    try {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      return t.get(g);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    } finally {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      t.close();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  }<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * Gets the region info and assignment for the specified region.<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * @param connection connection we're using<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * @param regionName Region to lookup.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * @return Location and RegionInfo for &lt;code&gt;regionName&lt;/code&gt;<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * @deprecated use {@link #getRegionLocation(Connection, byte[])} instead<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   */<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  @Deprecated<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  public static Pair&lt;RegionInfo, ServerName&gt; getRegion(Connection connection, byte [] regionName)<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    throws IOException {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    HRegionLocation location = getRegionLocation(connection, regionName);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    return location == null<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      ? null<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      : new Pair&lt;&gt;(location.getRegionInfo(), location.getServerName());<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>  /**<a name="line.301"></a>
+<span class="sourceLineNo">302</span>   * Returns the HRegionLocation from meta for the given region<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * @param connection connection we're using<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * @param regionName region we're looking for<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * @return HRegionLocation for the given region<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   */<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  public static HRegionLocation getRegionLocation(Connection connection, byte[] regionName)<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      throws IOException {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    byte[] row = regionName;<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    RegionInfo parsedInfo = null;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    try {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      parsedInfo = parseRegionInfoFromRegionName(regionName);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      row = getMetaKeyForRegion(parsedInfo);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    } catch (Exception parseEx) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      // Ignore. This is used with tableName passed as regionName.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    Get get = new Get(row);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    Result r = get(getMetaHTable(connection), get);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    RegionLocations locations = getRegionLocations(r);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return locations == null ? null<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      : locations.getRegionLocation(parsedInfo == null ? 0 : parsedInfo.getReplicaId());<a name="line.322"></a>
+<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
+<span class="sourceLineNo">324</span><a name="line.324"></a>
+<span class="sourceLineNo">325</span>  /**<a name="line.325"></a>
+<span class="sourceLineNo">326</span>   * Returns the HRegionLocation from meta for the given region<a name="line.326"></a>
+<span class="sourceLineNo">327</span>   * @param connection connection we're using<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   * @param regionInfo region information<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   * @return HRegionLocation for the given region<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   */<a name="line.330"></a>
+<span class="sourceLineNo">331</span>  public static HRegionLocation getRegionLocation(Connection connection, RegionInfo regionInfo)<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      throws IOException {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    byte[] row = getMetaKeyForRegion(regionInfo);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    Get get = new Get(row);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    Result r = get(getMetaHTable(connection), get);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    return getRegionLocation(r, regionInfo, regionInfo.getReplicaId());<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  }<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  /** Returns the row key to use for this regionInfo */<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  public static byte[] getMetaKeyForRegion(RegionInfo regionInfo) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    return RegionReplicaUtil.getRegionInfoForDefaultReplica(regionInfo).getRegionName();<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  /** Returns an HRI parsed from this regionName. Not all the fields of the HRI<a name="line.345"></a>
+<span class="sourceLineNo">346</span>   * is stored in the name, so the returned object should only be used for the fields<a name="line.346"></a>
+<span class="sourceLineNo">347</span>   * in the regionName.<a name="line.347"></a>
+<span class="sourceLineNo">348</span>   */<a name="line.348"></a>
+<span class="sourceLineNo">349</span>  public static RegionInfo parseRegionInfoFromRegionName(byte[] regionName) throws IOException {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    byte[][] fields = RegionInfo.parseRegionName(regionName);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    long regionId = Long.parseLong(Bytes.toString(fields[2]));<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    int replicaId = fields.length &gt; 3 ? Integer.parseInt(Bytes.toString(fields[3]), 16) : 0;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    return RegionInfoBuilder.newBuilder(TableName.valueOf(fields[0]))<a name="line.353"></a>
+<span class="sourceLineNo">354</span>              .setStartKey(fields[1])<a name="line.354"></a>
+<span class="sourceLineNo">355</span>              .setEndKey(fields[2])<a name="line.355"></a>
+<span class="sourceLineNo">356</span>              .setSplit(false)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>              .setRegionId(regionId)<a name="line.357"></a>
+<span class="sourceLineNo">358</span>              .setReplicaId(replicaId)<a name="line.358"></a>
+<span class="sourceLineNo">359</span>              .build();<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  }<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * Gets the result in hbase:meta for the specified region.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   * @param connection connection we're using<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   * @param regionName region we're looking for<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   * @return result of the specified region<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
+<span class="sourceLineNo">368</span>  public static Result getRegionResult(Connection connection,<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      byte[] regionName) throws IOException {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    Get get = new Get(regionName);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    return get(getMetaHTable(connection), get);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>  }<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>   * Get regions from the merge qualifier of the specified merged region<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * @return null if it doesn't contain merge qualifier, else two merge regions<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   */<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  @Nullable<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  public static Pair&lt;RegionInfo, RegionInfo&gt; getRegionsFromMergeQualifier(<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      Connection connection, byte[] regionName) throws IOException {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    Result result = getRegionResult(connection, regionName);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    RegionInfo mergeA = getRegionInfo(result, HConstants.MERGEA_QUALIFIER);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    RegionInfo mergeB = getRegionInfo(result, HConstants.MERGEB_QUALIFIER);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (mergeA == null &amp;&amp; mergeB == null) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return null;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    return new Pair&lt;&gt;(mergeA, mergeB);<a name="line.388"></a>
+<span class="sourceLineNo">389</span> }<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>   * Checks if the specified table exists.  Looks at the hbase:meta table hosted on<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * the specified server.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * @param connection connection we're using<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @param tableName table to check<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   * @return true if the table exists in meta, false if not<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   */<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  public static boolean tableExists(Connection connection,<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      final TableName tableName)<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  throws IOException {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // Catalog tables always exist.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    return tableName.equals(TableName.META_TABLE_NAME)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || getTableState(connection, tableName) != null;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  /**<a name="line.406"></a>
+<span class="sourceLineNo">407</span>   * Lists all of the regions currently in META.<a name="line.407"></a>
+<span class="sourceLineNo">408</span>   *<a name="line.408"></a>
+<span class="sourceLineNo">409</span>   * @param connection to connect with<a name="line.409"></a>
+<span class="sourceLineNo">410</span>   * @param excludeOfflinedSplitParents False if we are to include offlined/splitparents regions,<a name="line.410"></a>
+<span class="sourceLineNo">411</span>   *                                    true and we'll leave out offlined regions from returned list<a name="line.411"></a>
+<span class="sourceLineNo">412</span>   * @return List of all user-space regions.<a name="line.412"></a>
+<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
+<span class="sourceLineNo">414</span>  @VisibleForTesting<a name="line.414"></a>
+<span class="sourceLineNo">415</span>  public static List&lt;RegionInfo&gt; getAllRegions(Connection connection,<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      boolean excludeOfflinedSplitParents)<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      throws IOException {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result;<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    result = getTableRegionsAndLocations(connection, null,<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        excludeOfflinedSplitParents);<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>    return getListOfRegionInfos(result);<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>  }<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>  /**<a name="line.427"></a>
+<span class="sourceLineNo">428</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.428"></a>
+<span class="sourceLineNo">429</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.429"></a>
+<span class="sourceLineNo">430</span>   * @param connection connection we're using<a name="line.430"></a>
+<span class="sourceLineNo">431</span>   * @param tableName table we're looking for<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName)<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  throws IOException {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    return getTableRegions(connection, tableName, false);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  }<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>   * Gets all of the regions of the specified table. Do not use this method<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   * @param connection connection we're using<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @param tableName table we're looking for<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   * @param excludeOfflinedSplitParents If true, do not include offlined split<a name="line.444"></a>
+<span class="sourceLineNo">445</span>   * parents in the return.<a name="line.445"></a>
+<span class="sourceLineNo">446</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>   */<a name="line.447"></a>
+<span class="sourceLineNo">448</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName,<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result =<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      getTableRegionsAndLocations(connection, tableName, excludeOfflinedSplitParents);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    return getListOfRegionInfos(result);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  private static List&lt;RegionInfo&gt; getListOfRegionInfos(<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      final List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs) {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    if (pairs == null || pairs.isEmpty()) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      return Collections.emptyList();<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    List&lt;RegionInfo&gt; result = new ArrayList&lt;&gt;(pairs.size());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      result.add(pair.getFirst());<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    return result;<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>  /**<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * @param tableName table we're working with<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * @return start row for scanning META according to query type<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   */<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  public static byte[] getTableStartRowForMeta(TableName tableName, QueryType type) {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    if (tableName == null) {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      return null;<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    switch (type) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    case REGION:<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      byte[] startRow = new byte[tableName.getName().length + 2];<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      System.arraycopy(tableName.getName(), 0, startRow, 0, tableName.getName().length);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      startRow[startRow.length - 2] = HConstants.DELIMITER;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      startRow[startRow.length - 1] = HConstants.DELIMITER;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      return startRow;<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    case ALL:<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    case TABLE:<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    default:<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      return tableName.getName();<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    }<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>  /**<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * @param tableName table we're working with<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   * @return stop row for scanning META according to query type<a name="line.491"></a>
+<span class="sourceLineNo">492</span>   */<a name="line.492"></a>
+<span class="sourceLineNo">493</span>  public static byte[] getTableStopRowForMeta(TableName tableName, QueryType type) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    if (tableName == null) {<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return null;<a name="line.495"></a>
 <span class="sourceLineNo">496</span>    }<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>  /**<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   * @param tableName table we're working with<a name="line.500"></a>
-<span class="sourceLineNo">501</span>   * @return stop row for scanning META according to query type<a name="line.501"></a>
-<span class="sourceLineNo">502</span>   */<a name="line.502"></a>
-<span class="sourceLineNo">503</span>  public static byte[] getTableStopRowForMeta(TableName tableName, QueryType type) {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    if (tableName == null) {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      return null;<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    }<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    final byte[] stopRow;<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    switch (type) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    case REGION:<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      stopRow = new byte[tableName.getName().length + 3];<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      System.arraycopy(tableName.getName(), 0, stopRow, 0, tableName.getName().length);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      stopRow[stopRow.length - 3] = ' ';<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      stopRow[stopRow.length - 2] = HConstants.DELIMITER;<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      stopRow[stopRow.length - 1] = HConstants.DELIMITER;<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      break;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    case ALL:<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    case TABLE:<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    default:<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      stopRow = new byte[tableName.getName().length + 1];<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      System.arraycopy(tableName.getName(), 0, stopRow, 0, tableName.getName().length);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      stopRow[stopRow.length - 1] = ' ';<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      break;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    }<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    return stopRow;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * This method creates a Scan object that will only scan catalog rows that<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   * belong to the specified table. It doesn't specify any columns.<a name="line.529"></a>
-<span class="sourceLineNo">530</span>   * This is a better alternative to just using a start row and scan until<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * it hits a new table since that requires parsing the HRI to get the table<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   * name.<a name="line.532"></a>
-<span class="sourceLineNo">533</span>   * @param tableName bytes of table's name<a name="line.533"></a>
-<span class="sourceLineNo">534</span>   * @return configured Scan object<a name="line.534"></a>
-<span class="sourceLineNo">535</span>   */<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  @Deprecated<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  public static Scan getScanForTableName(Connection connection, TableName tableName) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    // Start key is just the table name with delimiters<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    byte[] startKey = getTableStartRowForMeta(tableName, QueryType.REGION);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    // Stop key appends the smallest possible char to the table name<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    byte[] stopKey = getTableStopRowForMeta(tableName, QueryType.REGION);<a name="line.541"></a>
-<span class="sourceLineNo">542</span><a name="line.542"></a>
-<span class="sourceLineNo">543</span>    Scan scan = getMetaScan(connection, -1);<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    scan.setStartRow(startKey);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    scan.setStopRow(stopKey);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    return scan;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>  private static Scan getMetaScan(Connection connection, int rowUpperLimit) {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    Scan scan = new Scan();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    int scannerCaching = connection.getConfiguration()<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        .getInt(HConstants.HBASE_META_SCANNER_CACHING,<a name="line.552"></a>
-<span class="sourceLineNo">553</span>            HConstants.DEFAULT_HBASE_META_SCANNER_CACHING);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    if (connection.getConfiguration().getBoolean(HConstants.USE_META_REPLICAS,<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        HConstants.DEFAULT_USE_META_REPLICAS)) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      scan.setConsistency(Consistency.TIMELINE);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    if (rowUpperLimit &gt; 0) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      scan.setLimit(rowUpperLimit);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      scan.setReadType(Scan.ReadType.PREAD);<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    scan.setCaching(scannerCaching);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    return scan;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  /**<a name="line.565"></a>
-<span class="sourceLineNo">566</span>   * Do not use this method to get meta table regions, use methods in MetaTableLocator instead.<a name="line.566"></a>
-<span class="sourceLineNo">567</span>   * @param connection connection we're using<a name="line.567"></a>
-<span class="sourceLineNo">568</span>   * @param tableName table we're looking for<a name="line.568"></a>
-<span class="sourceLineNo">569</span>   * @return Return list of regioninfos and server.<a name="line.569"></a>
-<span class="sourceLineNo">570</span>   * @throws IOException<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   */<a name="line.571"></a>
-<span class="sourceLineNo">572</span>  public static List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    getTableRegionsAndLocations(Connection connection, TableName tableName)<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      throws IOException {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    return getTableRegionsAndLocations(connection, tableName, true);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>  }<a name="line.576"></a>
-<span class="sourceLineNo">577</span><a name="line.577"></a>
-<span class="sourceLineNo">578</span>  /**<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   * Do not use this method to get meta table regions, use methods in MetaTableLocator instead.<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param connection connection we're using<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param tableName table to work with, can be null for getting all regions<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @param excludeOfflinedSplitParents don't return split parents<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   * @return Return list of regioninfos and server addresses.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   * @throws IOException<a name="line.584"></a>
-<span class="sourceLineNo">585</span>   */<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  public static List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; getTableRegionsAndLocations(<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      Connection connection, @Nullable final TableName tableName,<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    if (tableName != null &amp;&amp; tableName.equals(TableName.META_TABLE_NAME)) {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      throw new IOException("This method can't be used to locate meta regions;"<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        + " use MetaTableLocator instead");<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    }<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    // Make a version of CollectingVisitor that collects RegionInfo and ServerAddress<a name="line.593"></a>
-<span class="sourceLineNo">594</span>    CollectingVisitor&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; visitor =<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      new CollectingVisitor&lt;Pair&lt;RegionInfo, ServerName&gt;&gt;() {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>        private RegionLocations current = null;<a name="line.596"></a>
-<span class="sourceLineNo">597</span><a name="line.597"></a>
-<span class="sourceLineNo">598</span>        @Override<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        public boolean visit(Result r) throws IOException {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>          current = getRegionLocations(r);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          if (current == null || current.getRegionLocation().getRegion() == null) {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>            LOG.warn("No serialized RegionInfo in " + r);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>            return true;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>          }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          RegionInfo hri = current.getRegionLocation().getRegion();<a name="line.605"></a>
-<span class="sourceLineNo">606</span>          if (excludeOfflinedSplitParents &amp;&amp; hri.isSplitParent()) return true;<a name="line.606"></a>
-<span class="sourceLineNo">607</span>          // Else call super and add this Result to the collection.<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          return super.visit(r);<a name="line.608"></a>
-<span class="sourceLineNo">609</span>        }<a name="line.609"></a>
-<span class="sourceLineNo">610</span><a name="line.610"></a>
-<span class="sourceLineNo">611</span>        @Override<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        void add(Result r) {<a name="line.612"></a>
-<span class="sourceLineNo">613</span>          if (current == null) {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>            return;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>          }<a name="line.615"></a>
-<span class="sourceLineNo">616</span>          for (HRegionLocation loc : current.getRegionLocations()) {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>            if (loc != null) {<a name="line.617"></a>
-<span class="sourceLineNo">618</span>              this.results.add(new Pair&lt;&gt;(loc.getRegion(), loc.getServerName()));<a name="line.618"></a>
-<span class="sourceLineNo">619</span>            }<a name="line.619"></a>
-<span class="sourceLineNo">620</span>          }<a name="line.620"></a>
-<span class="sourceLineNo">621</span>        }<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      };<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    scanMeta(connection,<a name="line.623"></a>
-<span class="sourceLineNo">624</span>        getTableStartRowForMeta(tableName, QueryType.REGION),<a name="line.624"></a>
-<span class="sourceLineNo">625</span>        getTableStopRowForMeta(tableName, QueryType.REGION),<a name="line.625"></a>
-<span class="sourceLineNo">626</span>        QueryType.REGION, visitor);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    return visitor.getResults();<a name="line.627"></a>
-<span class="sourceLineNo">628</span>  }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>  /**<a name="line.630"></a>
-<span class="sourceLineNo">631</span>   * @param connection connection we're using<a name="line.631"></a>
-<span class="sourceLineNo">632</span>   * @param serverName server whose regions we're interested in<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * @return List of user regions installed on this server (does not include<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * catalog regions).<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   * @throws IOException<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   */<a name="line.636"></a>
-<span class="sourceLineNo">637</span>  public static NavigableMap&lt;RegionInfo, Result&gt;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>  getServerUserRegions(Connection connection, final ServerName serverName)<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    throws IOException {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    final NavigableMap&lt;RegionInfo, Result&gt; hris = new TreeMap&lt;&gt;();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    // Fill the above hris map with entries from hbase:meta that have the passed<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    // servername.<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    CollectingVisitor&lt;Result&gt; v = new CollectingVisitor&lt;Result&gt;() {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      @Override<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      void add(Result r) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        if (r == null || r.isEmpty()) return;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        RegionLocations locations = getRegionLocations(r);<a name="line.647"></a>
-<span class="sourceLineNo">648</span>        if (locations == null) return;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>          if (loc != null) {<a name="line.650"></a>
-<span class="sourceLineNo">651</span>            if (loc.getServerName() != null &amp;&amp; loc.getServerName().equals(serverName)) {<a name="line.651"></a>
-<span class="sourceLineNo">652</span>              hris.put(loc.getRegion(), r);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>            }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>          }<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    };<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    scanMeta(connection, null, null, QueryType.REGION, v);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    return hris;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>  }<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  public static void fullScanMetaAndPrint(Connection connection)<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    throws IOException {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    Visitor v = new Visitor() {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      @Override<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      public boolean visit(Result r) throws IOException {<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        if (r ==  null || r.isEmpty()) return true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        LOG.info("fullScanMetaAndPrint.Current Meta Row: " + r);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        TableState state = getTableState(r);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (state != null) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          LOG.info("Table State: " + state);<a name="line.671"></a>
-<span class="sourceLineNo">672</span>        } else {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>          RegionLocations locations = getRegionLocations(r);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>          if (locations == null) return true;<a name="line.674"></a>
-<span class="sourceLineNo">675</span>          for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.675"></a>
-<span class="sourceLineNo">676</span>            if (loc != null) {<a name="line.676"></a>
-<span class="sourceLineNo">677</span>              LOG.info("fullScanMetaAndPrint.HRI Print= " + loc.getRegion());<a name="line.677"></a>
-<span class="sourceLineNo">678</span>            }<a name="line.678"></a>
-<span class="sourceLineNo">679</span>          }<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        }<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        return true;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      }<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    };<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    scanMeta(connection, null, null, QueryType.ALL, v);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  }<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>  public static void scanMetaForTableRegions(Connection connection, Visitor visitor,<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      TableName tableName) throws IOException {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    scanMeta(connection, tableName, QueryType.REGION, Integer.MAX_VALUE, visitor);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>  }<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>  public static void scanMeta(Connection connection, TableName table, QueryType type, int maxRows,<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      final Visitor visitor) throws IOException {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    scanMeta(connection, getTableStartRowForMeta(table, type), getTableStopRowForMeta(table, type),<a name="line.694"></a>
-<span class="sourceLineNo">695</span> 

<TRUNCATED>

[38/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.html b/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.html
index cdd2f36..fea2b5a 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.html
@@ -151,2029 +151,2019 @@
 <span class="sourceLineNo">143</span>  private static final Logger LOG = LoggerFactory.getLogger(MetaTableAccessor.class);<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  private static final Logger METALOG = LoggerFactory.getLogger("org.apache.hadoop.hbase.META");<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final byte[] META_REGION_PREFIX;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  static {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    // Copy the prefix from FIRST_META_REGIONINFO into META_REGION_PREFIX.<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    // FIRST_META_REGIONINFO == 'hbase:meta,,1'.  META_REGION_PREFIX == 'hbase:meta,'<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    int len = RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName().length - 2;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    META_REGION_PREFIX = new byte [len];<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    System.arraycopy(RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName(), 0,<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      META_REGION_PREFIX, 0, len);<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>  @VisibleForTesting<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  public static final byte[] REPLICATION_PARENT_QUALIFIER = Bytes.toBytes("parent");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private static final byte ESCAPE_BYTE = (byte) 0xFF;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  private static final byte SEPARATED_BYTE = 0x00;<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>  /**<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * Lists all of the table regions currently in META.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   * Deprecated, keep there until some test use this.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @param connection what we will use<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * @param tableName table to list<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * @return Map of all user-space regions to servers<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   * @deprecated use {@link #getTableRegionsAndLocations}, region can have multiple locations<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  @Deprecated<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  public static NavigableMap&lt;RegionInfo, ServerName&gt; allTableRegions(<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      Connection connection, final TableName tableName) throws IOException {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    final NavigableMap&lt;RegionInfo, ServerName&gt; regions = new TreeMap&lt;&gt;();<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    Visitor visitor = new TableVisitorBase(tableName) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      @Override<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      public boolean visitInternal(Result result) throws IOException {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>        RegionLocations locations = getRegionLocations(result);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        if (locations == null) return true;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>          if (loc != null) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>            RegionInfo regionInfo = loc.getRegionInfo();<a name="line.182"></a>
-<span class="sourceLineNo">183</span>            regions.put(regionInfo, loc.getServerName());<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>        return true;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    };<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    scanMetaForTableRegions(connection, visitor, tableName);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    return regions;<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>  @InterfaceAudience.Private<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public enum QueryType {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    ALL(HConstants.TABLE_FAMILY, HConstants.CATALOG_FAMILY),<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    REGION(HConstants.CATALOG_FAMILY),<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    TABLE(HConstants.TABLE_FAMILY),<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    REPLICATION(HConstants.REPLICATION_BARRIER_FAMILY);<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>    private final byte[][] families;<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>    QueryType(byte[]... families) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      this.families = families;<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>    byte[][] getFamilies() {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      return this.families;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  }<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span>  /** The delimiter for meta columns for replicaIds &amp;gt; 0 */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  protected static final char META_REPLICA_ID_DELIMITER = '_';<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>  /** A regex for parsing server columns from meta. See above javadoc for meta layout */<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  private static final Pattern SERVER_COLUMN_PATTERN<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    = Pattern.compile("^server(_[0-9a-fA-F]{4})?$");<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>  ////////////////////////<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  // Reading operations //<a name="line.219"></a>
-<span class="sourceLineNo">220</span>  ////////////////////////<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.223"></a>
-<span class="sourceLineNo">224</span>   * @param connection connection we're using<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * @param visitor Visitor invoked against each row in regions family.<a name="line.225"></a>
+<span class="sourceLineNo">146</span>  @VisibleForTesting<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  public static final byte[] REPLICATION_PARENT_QUALIFIER = Bytes.toBytes("parent");<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final byte ESCAPE_BYTE = (byte) 0xFF;<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final byte SEPARATED_BYTE = 0x00;<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  /**<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * Lists all of the table regions currently in META.<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * Deprecated, keep there until some test use this.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   * @param connection what we will use<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   * @param tableName table to list<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   * @return Map of all user-space regions to servers<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   * @deprecated use {@link #getTableRegionsAndLocations}, region can have multiple locations<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   */<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  @Deprecated<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  public static NavigableMap&lt;RegionInfo, ServerName&gt; allTableRegions(<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      Connection connection, final TableName tableName) throws IOException {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    final NavigableMap&lt;RegionInfo, ServerName&gt; regions = new TreeMap&lt;&gt;();<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    Visitor visitor = new TableVisitorBase(tableName) {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      @Override<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      public boolean visitInternal(Result result) throws IOException {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        RegionLocations locations = getRegionLocations(result);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        if (locations == null) return true;<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>          if (loc != null) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>            RegionInfo regionInfo = loc.getRegionInfo();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>            regions.put(regionInfo, loc.getServerName());<a name="line.173"></a>
+<span class="sourceLineNo">174</span>          }<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>        return true;<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      }<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    };<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    scanMetaForTableRegions(connection, visitor, tableName);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    return regions;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>  @InterfaceAudience.Private<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  public enum QueryType {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    ALL(HConstants.TABLE_FAMILY, HConstants.CATALOG_FAMILY),<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    REGION(HConstants.CATALOG_FAMILY),<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    TABLE(HConstants.TABLE_FAMILY),<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    REPLICATION(HConstants.REPLICATION_BARRIER_FAMILY);<a name="line.188"></a>
+<span class="sourceLineNo">189</span><a name="line.189"></a>
+<span class="sourceLineNo">190</span>    private final byte[][] families;<a name="line.190"></a>
+<span class="sourceLineNo">191</span><a name="line.191"></a>
+<span class="sourceLineNo">192</span>    QueryType(byte[]... families) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      this.families = families;<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>    byte[][] getFamilies() {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      return this.families;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  }<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>  /** The delimiter for meta columns for replicaIds &amp;gt; 0 */<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  protected static final char META_REPLICA_ID_DELIMITER = '_';<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>  /** A regex for parsing server columns from meta. See above javadoc for meta layout */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  private static final Pattern SERVER_COLUMN_PATTERN<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    = Pattern.compile("^server(_[0-9a-fA-F]{4})?$");<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>  ////////////////////////<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  // Reading operations //<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  ////////////////////////<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>  /**<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * @param connection connection we're using<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * @param visitor Visitor invoked against each row in regions family.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   */<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  public static void fullScanRegions(Connection connection,<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      final Visitor visitor)<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      throws IOException {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    scanMeta(connection, null, null, QueryType.REGION, visitor);<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>  /**<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   * @param connection connection we're using<a name="line.225"></a>
 <span class="sourceLineNo">226</span>   */<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  public static void fullScanRegions(Connection connection,<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      final Visitor visitor)<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      throws IOException {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    scanMeta(connection, null, null, QueryType.REGION, visitor);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   * @param connection connection we're using<a name="line.235"></a>
+<span class="sourceLineNo">227</span>  public static List&lt;Result&gt; fullScanRegions(Connection connection)<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      throws IOException {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    return fullScan(connection, QueryType.REGION);<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>  /**<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for tables.<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * @param connection connection we're using<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * @param visitor Visitor invoked against each row in tables family.<a name="line.235"></a>
 <span class="sourceLineNo">236</span>   */<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  public static List&lt;Result&gt; fullScanRegions(Connection connection)<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      throws IOException {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    return fullScan(connection, QueryType.REGION);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for tables.<a name="line.243"></a>
-<span class="sourceLineNo">244</span>   * @param connection connection we're using<a name="line.244"></a>
-<span class="sourceLineNo">245</span>   * @param visitor Visitor invoked against each row in tables family.<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   */<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  public static void fullScanTables(Connection connection,<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      final Visitor visitor)<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      throws IOException {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    scanMeta(connection, null, null, QueryType.TABLE, visitor);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt;.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * @param connection connection we're using<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   * @param type scanned part of meta<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * @return List of {@link Result}<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  public static List&lt;Result&gt; fullScan(Connection connection, QueryType type)<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    throws IOException {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    CollectAllVisitor v = new CollectAllVisitor();<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    scanMeta(connection, null, null, type, v);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    return v.getResults();<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>  /**<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * Callers should call close on the returned {@link Table} instance.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * @param connection connection we're using to access Meta<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   * @return An {@link Table} for &lt;code&gt;hbase:meta&lt;/code&gt;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  public static Table getMetaHTable(final Connection connection)<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  throws IOException {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    // We used to pass whole CatalogTracker in here, now we just pass in Connection<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    if (connection == null) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      throw new NullPointerException("No connection");<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    } else if (connection.isClosed()) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      throw new IOException("connection is closed");<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    return connection.getTable(TableName.META_TABLE_NAME);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * @param t Table to use (will be closed when done).<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * @param g Get to run<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   */<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  private static Result get(final Table t, final Get g) throws IOException {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    if (t == null) return null;<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    try {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      return t.get(g);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    } finally {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      t.close();<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  /**<a name="line.295"></a>
-<span class="sourceLineNo">296</span>   * Gets the region info and assignment for the specified region.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   * @param connection connection we're using<a name="line.297"></a>
-<span class="sourceLineNo">298</span>   * @param regionName Region to lookup.<a name="line.298"></a>
-<span class="sourceLineNo">299</span>   * @return Location and RegionInfo for &lt;code&gt;regionName&lt;/code&gt;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * @deprecated use {@link #getRegionLocation(Connection, byte[])} instead<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  @Deprecated<a name="line.302"></a>
-<span class="sourceLineNo">303</span>  public static Pair&lt;RegionInfo, ServerName&gt; getRegion(Connection connection, byte [] regionName)<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    throws IOException {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    HRegionLocation location = getRegionLocation(connection, regionName);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    return location == null<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      ? null<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      : new Pair&lt;&gt;(location.getRegionInfo(), location.getServerName());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  /**<a name="line.311"></a>
-<span class="sourceLineNo">312</span>   * Returns the HRegionLocation from meta for the given region<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * @param connection connection we're using<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   * @param regionName region we're looking for<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   * @return HRegionLocation for the given region<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   */<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  public static HRegionLocation getRegionLocation(Connection connection, byte[] regionName)<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      throws IOException {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    byte[] row = regionName;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    RegionInfo parsedInfo = null;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    try {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      parsedInfo = parseRegionInfoFromRegionName(regionName);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      row = getMetaKeyForRegion(parsedInfo);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    } catch (Exception parseEx) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      // Ignore. This is used with tableName passed as regionName.<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    Get get = new Get(row);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    Result r = get(getMetaHTable(connection), get);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    RegionLocations locations = getRegionLocations(r);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    return locations == null ? null<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      : locations.getRegionLocation(parsedInfo == null ? 0 : parsedInfo.getReplicaId());<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  }<a name="line.333"></a>
-<span class="sourceLineNo">334</span><a name="line.334"></a>
-<span class="sourceLineNo">335</span>  /**<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   * Returns the HRegionLocation from meta for the given region<a name="line.336"></a>
-<span class="sourceLineNo">337</span>   * @param connection connection we're using<a name="line.337"></a>
-<span class="sourceLineNo">338</span>   * @param regionInfo region information<a name="line.338"></a>
-<span class="sourceLineNo">339</span>   * @return HRegionLocation for the given region<a name="line.339"></a>
-<span class="sourceLineNo">340</span>   */<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  public static HRegionLocation getRegionLocation(Connection connection, RegionInfo regionInfo)<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throws IOException {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    byte[] row = getMetaKeyForRegion(regionInfo);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    Get get = new Get(row);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    Result r = get(getMetaHTable(connection), get);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    return getRegionLocation(r, regionInfo, regionInfo.getReplicaId());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  }<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  /** Returns the row key to use for this regionInfo */<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  public static byte[] getMetaKeyForRegion(RegionInfo regionInfo) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    return RegionReplicaUtil.getRegionInfoForDefaultReplica(regionInfo).getRegionName();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  }<a name="line.353"></a>
-<span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>  /** Returns an HRI parsed from this regionName. Not all the fields of the HRI<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * is stored in the name, so the returned object should only be used for the fields<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   * in the regionName.<a name="line.357"></a>
-<span class="sourceLineNo">358</span>   */<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  public static RegionInfo parseRegionInfoFromRegionName(byte[] regionName) throws IOException {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    byte[][] fields = RegionInfo.parseRegionName(regionName);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    long regionId = Long.parseLong(Bytes.toString(fields[2]));<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    int replicaId = fields.length &gt; 3 ? Integer.parseInt(Bytes.toString(fields[3]), 16) : 0;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    return RegionInfoBuilder.newBuilder(TableName.valueOf(fields[0]))<a name="line.363"></a>
-<span class="sourceLineNo">364</span>              .setStartKey(fields[1])<a name="line.364"></a>
-<span class="sourceLineNo">365</span>              .setEndKey(fields[2])<a name="line.365"></a>
-<span class="sourceLineNo">366</span>              .setSplit(false)<a name="line.366"></a>
-<span class="sourceLineNo">367</span>              .setRegionId(regionId)<a name="line.367"></a>
-<span class="sourceLineNo">368</span>              .setReplicaId(replicaId)<a name="line.368"></a>
-<span class="sourceLineNo">369</span>              .build();<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>  /**<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * Gets the result in hbase:meta for the specified region.<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * @param connection connection we're using<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * @param regionName region we're looking for<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * @return result of the specified region<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   */<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public static Result getRegionResult(Connection connection,<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      byte[] regionName) throws IOException {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    Get get = new Get(regionName);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    return get(getMetaHTable(connection), get);<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>   * Get regions from the merge qualifier of the specified merged region<a name="line.386"></a>
-<span class="sourceLineNo">387</span>   * @return null if it doesn't contain merge qualifier, else two merge regions<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   */<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  @Nullable<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  public static Pair&lt;RegionInfo, RegionInfo&gt; getRegionsFromMergeQualifier(<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      Connection connection, byte[] regionName) throws IOException {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Result result = getRegionResult(connection, regionName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    RegionInfo mergeA = getRegionInfo(result, HConstants.MERGEA_QUALIFIER);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    RegionInfo mergeB = getRegionInfo(result, HConstants.MERGEB_QUALIFIER);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    if (mergeA == null &amp;&amp; mergeB == null) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      return null;<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    }<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    return new Pair&lt;&gt;(mergeA, mergeB);<a name="line.398"></a>
-<span class="sourceLineNo">399</span> }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>  /**<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * Checks if the specified table exists.  Looks at the hbase:meta table hosted on<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   * the specified server.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>   * @param connection connection we're using<a name="line.404"></a>
-<span class="sourceLineNo">405</span>   * @param tableName table to check<a name="line.405"></a>
-<span class="sourceLineNo">406</span>   * @return true if the table exists in meta, false if not<a name="line.406"></a>
-<span class="sourceLineNo">407</span>   */<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public static boolean tableExists(Connection connection,<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      final TableName tableName)<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  throws IOException {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // Catalog tables always exist.<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return tableName.equals(TableName.META_TABLE_NAME)<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        || getTableState(connection, tableName) != null;<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>   * Lists all of the regions currently in META.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   *<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   * @param connection to connect with<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   * @param excludeOfflinedSplitParents False if we are to include offlined/splitparents regions,<a name="line.420"></a>
-<span class="sourceLineNo">421</span>   *                                    true and we'll leave out offlined regions from returned list<a name="line.421"></a>
-<span class="sourceLineNo">422</span>   * @return List of all user-space regions.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   */<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  @VisibleForTesting<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  public static List&lt;RegionInfo&gt; getAllRegions(Connection connection,<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      boolean excludeOfflinedSplitParents)<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      throws IOException {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result;<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>    result = getTableRegionsAndLocations(connection, null,<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        excludeOfflinedSplitParents);<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>    return getListOfRegionInfos(result);<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  /**<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * @param connection connection we're using<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * @param tableName table we're looking for<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   */<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName)<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  throws IOException {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return getTableRegions(connection, tableName, false);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  /**<a name="line.449"></a>
-<span class="sourceLineNo">450</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.450"></a>
-<span class="sourceLineNo">451</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * @param connection connection we're using<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   * @param tableName table we're looking for<a name="line.453"></a>
-<span class="sourceLineNo">454</span>   * @param excludeOfflinedSplitParents If true, do not include offlined split<a name="line.454"></a>
-<span class="sourceLineNo">455</span>   * parents in the return.<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   */<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName,<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result =<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      getTableRegionsAndLocations(connection, tableName, excludeOfflinedSplitParents);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    return getListOfRegionInfos(result);<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>  private static List&lt;RegionInfo&gt; getListOfRegionInfos(<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      final List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    if (pairs == null || pairs.isEmpty()) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      return Collections.emptyList();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    List&lt;RegionInfo&gt; result = new ArrayList&lt;&gt;(pairs.size());<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      result.add(pair.getFirst());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    return result;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  }<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>  /**<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * @param tableName table we're working with<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * @return start row for scanning META according to query type<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   */<a name="line.480"></a>
-<span class="sourceLineNo">481</span>  public static byte[] getTableStartRowForMeta(TableName tableName, QueryType type) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    if (tableName == null) {<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      return null;<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    switch (type) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    case REGION:<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      byte[] startRow = new byte[tableName.getName().length + 2];<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      System.arraycopy(tableName.getName(), 0, startRow, 0, tableName.getName().length);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      startRow[startRow.length - 2] = HConstants.DELIMITER;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      startRow[startRow.length - 1] = HConstants.DELIMITER;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      return startRow;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    case ALL:<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    case TABLE:<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    default:<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      return tableName.getName();<a name="line.495"></a>
+<span class="sourceLineNo">237</span>  public static void fullScanTables(Connection connection,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      final Visitor visitor)<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      throws IOException {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    scanMeta(connection, null, null, QueryType.TABLE, visitor);<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>  /**<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt;.<a name="line.244"></a>
+<span class="sourceLineNo">245</span>   * @param connection connection we're using<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   * @param type scanned part of meta<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * @return List of {@link Result}<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   */<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  public static List&lt;Result&gt; fullScan(Connection connection, QueryType type)<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    throws IOException {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    CollectAllVisitor v = new CollectAllVisitor();<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    scanMeta(connection, null, null, type, v);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    return v.getResults();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  /**<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * Callers should call close on the returned {@link Table} instance.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * @param connection connection we're using to access Meta<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * @return An {@link Table} for &lt;code&gt;hbase:meta&lt;/code&gt;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  public static Table getMetaHTable(final Connection connection)<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  throws IOException {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    // We used to pass whole CatalogTracker in here, now we just pass in Connection<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    if (connection == null) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      throw new NullPointerException("No connection");<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    } else if (connection.isClosed()) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      throw new IOException("connection is closed");<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    return connection.getTable(TableName.META_TABLE_NAME);<a name="line.269"></a>
+<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  /**<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * @param t Table to use (will be closed when done).<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   * @param g Get to run<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  private static Result get(final Table t, final Get g) throws IOException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    if (t == null) return null;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    try {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      return t.get(g);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    } finally {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      t.close();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  }<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * Gets the region info and assignment for the specified region.<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * @param connection connection we're using<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * @param regionName Region to lookup.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * @return Location and RegionInfo for &lt;code&gt;regionName&lt;/code&gt;<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * @deprecated use {@link #getRegionLocation(Connection, byte[])} instead<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   */<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  @Deprecated<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  public static Pair&lt;RegionInfo, ServerName&gt; getRegion(Connection connection, byte [] regionName)<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    throws IOException {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    HRegionLocation location = getRegionLocation(connection, regionName);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    return location == null<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      ? null<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      : new Pair&lt;&gt;(location.getRegionInfo(), location.getServerName());<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>  /**<a name="line.301"></a>
+<span class="sourceLineNo">302</span>   * Returns the HRegionLocation from meta for the given region<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * @param connection connection we're using<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * @param regionName region we're looking for<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * @return HRegionLocation for the given region<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   */<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  public static HRegionLocation getRegionLocation(Connection connection, byte[] regionName)<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      throws IOException {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    byte[] row = regionName;<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    RegionInfo parsedInfo = null;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    try {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      parsedInfo = parseRegionInfoFromRegionName(regionName);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      row = getMetaKeyForRegion(parsedInfo);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    } catch (Exception parseEx) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      // Ignore. This is used with tableName passed as regionName.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    Get get = new Get(row);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    Result r = get(getMetaHTable(connection), get);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    RegionLocations locations = getRegionLocations(r);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return locations == null ? null<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      : locations.getRegionLocation(parsedInfo == null ? 0 : parsedInfo.getReplicaId());<a name="line.322"></a>
+<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
+<span class="sourceLineNo">324</span><a name="line.324"></a>
+<span class="sourceLineNo">325</span>  /**<a name="line.325"></a>
+<span class="sourceLineNo">326</span>   * Returns the HRegionLocation from meta for the given region<a name="line.326"></a>
+<span class="sourceLineNo">327</span>   * @param connection connection we're using<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   * @param regionInfo region information<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   * @return HRegionLocation for the given region<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   */<a name="line.330"></a>
+<span class="sourceLineNo">331</span>  public static HRegionLocation getRegionLocation(Connection connection, RegionInfo regionInfo)<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      throws IOException {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    byte[] row = getMetaKeyForRegion(regionInfo);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    Get get = new Get(row);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    Result r = get(getMetaHTable(connection), get);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    return getRegionLocation(r, regionInfo, regionInfo.getReplicaId());<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  }<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  /** Returns the row key to use for this regionInfo */<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  public static byte[] getMetaKeyForRegion(RegionInfo regionInfo) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    return RegionReplicaUtil.getRegionInfoForDefaultReplica(regionInfo).getRegionName();<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  /** Returns an HRI parsed from this regionName. Not all the fields of the HRI<a name="line.345"></a>
+<span class="sourceLineNo">346</span>   * is stored in the name, so the returned object should only be used for the fields<a name="line.346"></a>
+<span class="sourceLineNo">347</span>   * in the regionName.<a name="line.347"></a>
+<span class="sourceLineNo">348</span>   */<a name="line.348"></a>
+<span class="sourceLineNo">349</span>  public static RegionInfo parseRegionInfoFromRegionName(byte[] regionName) throws IOException {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    byte[][] fields = RegionInfo.parseRegionName(regionName);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    long regionId = Long.parseLong(Bytes.toString(fields[2]));<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    int replicaId = fields.length &gt; 3 ? Integer.parseInt(Bytes.toString(fields[3]), 16) : 0;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    return RegionInfoBuilder.newBuilder(TableName.valueOf(fields[0]))<a name="line.353"></a>
+<span class="sourceLineNo">354</span>              .setStartKey(fields[1])<a name="line.354"></a>
+<span class="sourceLineNo">355</span>              .setEndKey(fields[2])<a name="line.355"></a>
+<span class="sourceLineNo">356</span>              .setSplit(false)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>              .setRegionId(regionId)<a name="line.357"></a>
+<span class="sourceLineNo">358</span>              .setReplicaId(replicaId)<a name="line.358"></a>
+<span class="sourceLineNo">359</span>              .build();<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  }<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * Gets the result in hbase:meta for the specified region.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   * @param connection connection we're using<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   * @param regionName region we're looking for<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   * @return result of the specified region<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
+<span class="sourceLineNo">368</span>  public static Result getRegionResult(Connection connection,<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      byte[] regionName) throws IOException {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    Get get = new Get(regionName);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    return get(getMetaHTable(connection), get);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>  }<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>   * Get regions from the merge qualifier of the specified merged region<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * @return null if it doesn't contain merge qualifier, else two merge regions<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   */<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  @Nullable<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  public static Pair&lt;RegionInfo, RegionInfo&gt; getRegionsFromMergeQualifier(<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      Connection connection, byte[] regionName) throws IOException {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    Result result = getRegionResult(connection, regionName);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    RegionInfo mergeA = getRegionInfo(result, HConstants.MERGEA_QUALIFIER);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    RegionInfo mergeB = getRegionInfo(result, HConstants.MERGEB_QUALIFIER);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (mergeA == null &amp;&amp; mergeB == null) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return null;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    return new Pair&lt;&gt;(mergeA, mergeB);<a name="line.388"></a>
+<span class="sourceLineNo">389</span> }<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>   * Checks if the specified table exists.  Looks at the hbase:meta table hosted on<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * the specified server.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * @param connection connection we're using<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @param tableName table to check<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   * @return true if the table exists in meta, false if not<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   */<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  public static boolean tableExists(Connection connection,<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      final TableName tableName)<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  throws IOException {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // Catalog tables always exist.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    return tableName.equals(TableName.META_TABLE_NAME)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || getTableState(connection, tableName) != null;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  /**<a name="line.406"></a>
+<span class="sourceLineNo">407</span>   * Lists all of the regions currently in META.<a name="line.407"></a>
+<span class="sourceLineNo">408</span>   *<a name="line.408"></a>
+<span class="sourceLineNo">409</span>   * @param connection to connect with<a name="line.409"></a>
+<span class="sourceLineNo">410</span>   * @param excludeOfflinedSplitParents False if we are to include offlined/splitparents regions,<a name="line.410"></a>
+<span class="sourceLineNo">411</span>   *                                    true and we'll leave out offlined regions from returned list<a name="line.411"></a>
+<span class="sourceLineNo">412</span>   * @return List of all user-space regions.<a name="line.412"></a>
+<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
+<span class="sourceLineNo">414</span>  @VisibleForTesting<a name="line.414"></a>
+<span class="sourceLineNo">415</span>  public static List&lt;RegionInfo&gt; getAllRegions(Connection connection,<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      boolean excludeOfflinedSplitParents)<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      throws IOException {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result;<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    result = getTableRegionsAndLocations(connection, null,<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        excludeOfflinedSplitParents);<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>    return getListOfRegionInfos(result);<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>  }<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>  /**<a name="line.427"></a>
+<span class="sourceLineNo">428</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.428"></a>
+<span class="sourceLineNo">429</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.429"></a>
+<span class="sourceLineNo">430</span>   * @param connection connection we're using<a name="line.430"></a>
+<span class="sourceLineNo">431</span>   * @param tableName table we're looking for<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName)<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  throws IOException {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    return getTableRegions(connection, tableName, false);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  }<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>   * Gets all of the regions of the specified table. Do not use this method<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   * @param connection connection we're using<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @param tableName table we're looking for<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   * @param excludeOfflinedSplitParents If true, do not include offlined split<a name="line.444"></a>
+<span class="sourceLineNo">445</span>   * parents in the return.<a name="line.445"></a>
+<span class="sourceLineNo">446</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>   */<a name="line.447"></a>
+<span class="sourceLineNo">448</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName,<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result =<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      getTableRegionsAndLocations(connection, tableName, excludeOfflinedSplitParents);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    return getListOfRegionInfos(result);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  private static List&lt;RegionInfo&gt; getListOfRegionInfos(<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      final List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs) {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    if (pairs == null || pairs.isEmpty()) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      return Collections.emptyList();<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    List&lt;RegionInfo&gt; result = new ArrayList&lt;&gt;(pairs.size());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      result.add(pair.getFirst());<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    return result;<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>  /**<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * @param tableName table we're working with<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * @return start row for scanning META according to query type<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   */<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  public static byte[] getTableStartRowForMeta(TableName tableName, QueryType type) {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    if (tableName == null) {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      return null;<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    switch (type) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    case REGION:<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      byte[] startRow = new byte[tableName.getName().length + 2];<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      System.arraycopy(tableName.getName(), 0, startRow, 0, tableName.getName().length);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      startRow[startRow.length - 2] = HConstants.DELIMITER;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      startRow[startRow.length - 1] = HConstants.DELIMITER;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      return startRow;<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    case ALL:<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    case TABLE:<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    default:<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      return tableName.getName();<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    }<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>  /**<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * @param tableName table we're working with<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   * @return stop row for scanning META according to query type<a name="line.491"></a>
+<span class="sourceLineNo">492</span>   */<a name="line.492"></a>
+<span class="sourceLineNo">493</span>  public static byte[] getTableStopRowForMeta(TableName tableName, QueryType type) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    if (tableName == null) {<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return null;<a name="line.495"></a>
 <span class="sourceLineNo">496</span>    }<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>  /**<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   * @param tableName table we're working with<a name="line.500"></a>
-<span class="sourceLineNo">501</span>   * @return stop row for scanning META according to query type<a name="line.501"></a>
-<span class="sourceLineNo">502</span>   */<a name="line.502"></a>
-<span class="sourceLineNo">503</span>  public static byte[] getTableStopRowForMeta(TableName tableName, QueryType type) {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    if (tableName == null) {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      return null;<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    }<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    final byte[] stopRow;<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    switch (type) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    case REGION:<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      stopRow = new byte[tableName.getName().length + 3];<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      System.arraycopy(tableName.getName(), 0, stopRow, 0, tableName.getName().length);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      stopRow[stopRow.length - 3] = ' ';<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      stopRow[stopRow.length - 2] = HConstants.DELIMITER;<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      stopRow[stopRow.length - 1] = HConstants.DELIMITER;<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      break;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    case ALL:<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    case TABLE:<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    default:<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      stopRow = new byte[tableName.getName().length + 1];<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      System.arraycopy(tableName.getName(), 0, stopRow, 0, tableName.getName().length);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      stopRow[stopRow.length - 1] = ' ';<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      break;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    }<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    return stopRow;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * This method creates a Scan object that will only scan catalog rows that<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   * belong to the specified table. It doesn't specify any columns.<a name="line.529"></a>
-<span class="sourceLineNo">530</span>   * This is a better alternative to just using a start row and scan until<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * it hits a new table since that requires parsing the HRI to get the table<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   * name.<a name="line.532"></a>
-<span class="sourceLineNo">533</span>   * @param tableName bytes of table's name<a name="line.533"></a>
-<span class="sourceLineNo">534</span>   * @return configured Scan object<a name="line.534"></a>
-<span class="sourceLineNo">535</span>   */<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  @Deprecated<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  public static Scan getScanForTableName(Connection connection, TableName tableName) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    // Start key is just the table name with delimiters<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    byte[] startKey = getTableStartRowForMeta(tableName, QueryType.REGION);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    // Stop key appends the smallest possible char to the table name<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    byte[] stopKey = getTableStopRowForMeta(tableName, QueryType.REGION);<a name="line.541"></a>
-<span class="sourceLineNo">542</span><a name="line.542"></a>
-<span class="sourceLineNo">543</span>    Scan scan = getMetaScan(connection, -1);<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    scan.setStartRow(startKey);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    scan.setStopRow(stopKey);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    return scan;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>  private static Scan getMetaScan(Connection connection, int rowUpperLimit) {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    Scan scan = new Scan();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    int scannerCaching = connection.getConfiguration()<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        .getInt(HConstants.HBASE_META_SCANNER_CACHING,<a name="line.552"></a>
-<span class="sourceLineNo">553</span>            HConstants.DEFAULT_HBASE_META_SCANNER_CACHING);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    if (connection.getConfiguration().getBoolean(HConstants.USE_META_REPLICAS,<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        HConstants.DEFAULT_USE_META_REPLICAS)) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      scan.setConsistency(Consistency.TIMELINE);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    if (rowUpperLimit &gt; 0) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      scan.setLimit(rowUpperLimit);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      scan.setReadType(Scan.ReadType.PREAD);<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    scan.setCaching(scannerCaching);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    return scan;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  /**<a name="line.565"></a>
-<span class="sourceLineNo">566</span>   * Do not use this method to get meta table regions, use methods in MetaTableLocator instead.<a name="line.566"></a>
-<span class="sourceLineNo">567</span>   * @param connection connection we're using<a name="line.567"></a>
-<span class="sourceLineNo">568</span>   * @param tableName table we're looking for<a name="line.568"></a>
-<span class="sourceLineNo">569</span>   * @return Return list of regioninfos and server.<a name="line.569"></a>
-<span class="sourceLineNo">570</span>   * @throws IOException<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   */<a name="line.571"></a>
-<span class="sourceLineNo">572</span>  public static List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    getTableRegionsAndLocations(Connection connection, TableName tableName)<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      throws IOException {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    return getTableRegionsAndLocations(connection, tableName, true);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>  }<a name="line.576"></a>
-<span class="sourceLineNo">577</span><a name="line.577"></a>
-<span class="sourceLineNo">578</span>  /**<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   * Do not use this method to get meta table regions, use methods in MetaTableLocator instead.<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param connection connection we're using<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param tableName table to work with, can be null for getting all regions<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @param excludeOfflinedSplitParents don't return split parents<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   * @return Return list of regioninfos and server addresses.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   * @throws IOException<a name="line.584"></a>
-<span class="sourceLineNo">585</span>   */<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  public static List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; getTableRegionsAndLocations(<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      Connection connection, @Nullable final TableName tableName,<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    if (tableName != null &amp;&amp; tableName.equals(TableName.META_TABLE_NAME)) {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      throw new IOException("This method can't be used to locate meta regions;"<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        + " use MetaTableLocator instead");<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    }<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    // Make a version of CollectingVisitor that collects RegionInfo and ServerAddress<a name="line.593"></a>
-<span class="sourceLineNo">594</span>    CollectingVisitor&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; visitor =<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      new CollectingVisitor&lt;Pair&lt;RegionInfo, ServerName&gt;&gt;() {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>        private RegionLocations current = null;<a name="line.596"></a>
-<span class="sourceLineNo">597</span><a name="line.597"></a>
-<span class="sourceLineNo">598</span>        @Override<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        public boolean visit(Result r) throws IOException {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>          current = getRegionLocations(r);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          if (current == null || current.getRegionLocation().getRegion() == null) {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>            LOG.warn("No serialized RegionInfo in " + r);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>            return true;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>          }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          RegionInfo hri = current.getRegionLocation().getRegion();<a name="line.605"></a>
-<span class="sourceLineNo">606</span>          if (excludeOfflinedSplitParents &amp;&amp; hri.isSplitParent()) return true;<a name="line.606"></a>
-<span class="sourceLineNo">607</span>          // Else call super and add this Result to the collection.<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          return super.visit(r);<a name="line.608"></a>
-<span class="sourceLineNo">609</span>        }<a name="line.609"></a>
-<span class="sourceLineNo">610</span><a name="line.610"></a>
-<span class="sourceLineNo">611</span>        @Override<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        void add(Result r) {<a name="line.612"></a>
-<span class="sourceLineNo">613</span>          if (current == null) {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>            return;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>          }<a name="line.615"></a>
-<span class="sourceLineNo">616</span>          for (HRegionLocation loc : current.getRegionLocations()) {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>            if (loc != null) {<a name="line.617"></a>
-<span class="sourceLineNo">618</span>              this.results.add(new Pair&lt;&gt;(loc.getRegion(), loc.getServerName()));<a name="line.618"></a>
-<span class="sourceLineNo">619</span>            }<a name="line.619"></a>
-<span class="sourceLineNo">620</span>          }<a name="line.620"></a>
-<span class="sourceLineNo">621</span>        }<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      };<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    scanMeta(connection,<a name="line.623"></a>
-<span class="sourceLineNo">624</span>        getTableStartRowForMeta(tableName, QueryType.REGION),<a name="line.624"></a>
-<span class="sourceLineNo">625</span>        getTableStopRowForMeta(tableName, QueryType.REGION),<a name="line.625"></a>
-<span class="sourceLineNo">626</span>        QueryType.REGION, visitor);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    return visitor.getResults();<a name="line.627"></a>
-<span class="sourceLineNo">628</span>  }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>  /**<a name="line.630"></a>
-<span class="sourceLineNo">631</span>   * @param connection connection we're using<a name="line.631"></a>
-<span class="sourceLineNo">632</span>   * @param serverName server whose regions we're interested in<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * @return List of user regions installed on this server (does not include<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * catalog regions).<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   * @throws IOException<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   */<a name="line.636"></a>
-<span class="sourceLineNo">637</span>  public static NavigableMap&lt;RegionInfo, Result&gt;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>  getServerUserRegions(Connection connection, final ServerName serverName)<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    throws IOException {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    final NavigableMap&lt;RegionInfo, Result&gt; hris = new TreeMap&lt;&gt;();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    // Fill the above hris map with entries from hbase:meta that have the passed<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    // servername.<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    CollectingVisitor&lt;Result&gt; v = new CollectingVisitor&lt;Result&gt;() {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      @Override<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      void add(Result r) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        if (r == null || r.isEmpty()) return;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        RegionLocations locations = getRegionLocations(r);<a name="line.647"></a>
-<span class="sourceLineNo">648</span>        if (locations == null) return;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>          if (loc != null) {<a name="line.650"></a>
-<span class="sourceLineNo">651</span>            if (loc.getServerName() != null &amp;&amp; loc.getServerName().equals(serverName)) {<a name="line.651"></a>
-<span class="sourceLineNo">652</span>              hris.put(loc.getRegion(), r);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>            }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>          }<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    };<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    scanMeta(connection, null, null, QueryType.REGION, v);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    return hris;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>  }<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  public static void fullScanMetaAndPrint(Connection connection)<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    throws IOException {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    Visitor v = new Visitor() {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      @Override<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      public boolean visit(Result r) throws IOException {<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        if (r ==  null || r.isEmpty()) return true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        LOG.info("fullScanMetaAndPrint.Current Meta Row: " + r);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        TableState state = getTableState(r);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (state != null) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          LOG.info("Table State: " + state);<a name="line.671"></a>
-<span class="sourceLineNo">672</span>        } else {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>          RegionLocations locations = getRegionLocations(r);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>          if (locations == null) return true;<a name="line.674"></a>
-<span class="sourceLineNo">675</span>          for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.675"></a>
-<span class="sourceLineNo">676</span>            if (loc != null) {<a name="line.676"></a>
-<span class="sourceLineNo">677</span>              LOG.info("fullScanMetaAndPrint.HRI Print= " + loc.getRegion());<a name="line.677"></a>
-<span class="sourceLineNo">678</span>            }<a name="line.678"></a>
-<span class="sourceLineNo">679</span>          }<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        }<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        return true;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      }<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    };<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    scanMeta(connection, null, null, QueryType.ALL, v);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  }<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>  public static void scanMetaForTableRegions(Connection connection, Visitor visitor,<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      TableName tableName) throws IOException {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    scanMeta(connection, tableName, QueryType.REGION, Integer.MAX_VALUE, visitor);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>  }<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>  public static void scanMeta(Connection connection, TableName table, QueryType type, int maxRows,<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      final Visitor visitor) throws IOException {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    scanMeta(connection, getTableStartRowForMeta(table, type), getTableStopRowForMeta(table, type),<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      type, maxRows, visitor);<a name="line.695"></a>
-<span class="sourceLineNo">696</span

<TRUNCATED>

[51/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.


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

Branch: refs/heads/asf-site
Commit: f2065178e456f32ea5bcb6c5b82571151cb659f5
Parents: 64bc8d8
Author: jenkins <bu...@apache.org>
Authored: Sat May 5 14:51:47 2018 +0000
Committer: jenkins <bu...@apache.org>
Committed: Sat May 5 14:51:47 2018 +0000

----------------------------------------------------------------------
 acid-semantics.html                             |     4 +-
 apache_hbase_reference_guide.pdf                |     4 +-
 book.html                                       |     2 +-
 bulk-loads.html                                 |     4 +-
 checkstyle-aggregate.html                       | 33798 +++++++++--------
 checkstyle.rss                                  |     4 +-
 coc.html                                        |     4 +-
 dependencies.html                               |     4 +-
 dependency-convergence.html                     |     4 +-
 dependency-info.html                            |     4 +-
 dependency-management.html                      |     4 +-
 devapidocs/constant-values.html                 |     6 +-
 devapidocs/index-all.html                       |     2 -
 .../MetaTableAccessor.CloseableVisitor.html     |     2 +-
 .../MetaTableAccessor.CollectAllVisitor.html    |     6 +-
 .../MetaTableAccessor.CollectingVisitor.html    |    12 +-
 .../MetaTableAccessor.DefaultVisitorBase.html   |     8 +-
 .../hbase/MetaTableAccessor.QueryType.html      |    18 +-
 ...aTableAccessor.ReplicationBarrierResult.html |    18 +-
 .../MetaTableAccessor.TableVisitorBase.html     |     8 +-
 .../hadoop/hbase/MetaTableAccessor.Visitor.html |     4 +-
 .../apache/hadoop/hbase/MetaTableAccessor.html  |   241 +-
 .../hadoop/hbase/backup/package-tree.html       |     4 +-
 .../hadoop/hbase/client/package-tree.html       |    26 +-
 .../hadoop/hbase/filter/package-tree.html       |    10 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     4 +-
 .../apache/hadoop/hbase/ipc/package-tree.html   |     4 +-
 .../hbase/master/balancer/package-tree.html     |     2 +-
 .../hadoop/hbase/master/package-tree.html       |     4 +-
 .../hbase/master/procedure/package-tree.html    |     2 +-
 .../hadoop/hbase/monitoring/package-tree.html   |     2 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    14 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     4 +-
 .../hadoop/hbase/quotas/package-tree.html       |     6 +-
 .../hadoop/hbase/regionserver/package-tree.html |    16 +-
 .../regionserver/querymatcher/package-tree.html |     2 +-
 .../hbase/regionserver/wal/package-tree.html    |     2 +-
 .../replication/regionserver/package-tree.html  |     2 +-
 .../hbase/security/access/package-tree.html     |     2 +-
 .../hadoop/hbase/security/package-tree.html     |     2 +-
 .../hadoop/hbase/thrift/package-tree.html       |     2 +-
 .../apache/hadoop/hbase/util/package-tree.html  |     8 +-
 .../MetaTableAccessor.CloseableVisitor.html     |  3970 +-
 .../MetaTableAccessor.CollectAllVisitor.html    |  3970 +-
 .../MetaTableAccessor.CollectingVisitor.html    |  3970 +-
 .../MetaTableAccessor.DefaultVisitorBase.html   |  3970 +-
 .../hbase/MetaTableAccessor.QueryType.html      |  3970 +-
 ...aTableAccessor.ReplicationBarrierResult.html |  3970 +-
 .../MetaTableAccessor.TableVisitorBase.html     |  3970 +-
 .../hadoop/hbase/MetaTableAccessor.Visitor.html |  3970 +-
 .../apache/hadoop/hbase/MetaTableAccessor.html  |  3970 +-
 .../org/apache/hadoop/hbase/Version.html        |     6 +-
 downloads.html                                  |     4 +-
 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/index-all.html                   |    16 +-
 .../hbase/PerformanceEvaluation.AppendTest.html |     8 +-
 ...rformanceEvaluation.AsyncRandomReadTest.html |    22 +-
 ...formanceEvaluation.AsyncRandomWriteTest.html |     8 +-
 .../PerformanceEvaluation.AsyncScanTest.html    |    16 +-
 ...manceEvaluation.AsyncSequentialReadTest.html |     8 +-
 ...anceEvaluation.AsyncSequentialWriteTest.html |     8 +-
 .../PerformanceEvaluation.AsyncTableTest.html   |    12 +-
 .../hbase/PerformanceEvaluation.AsyncTest.html  |    12 +-
 ...rformanceEvaluation.BufferedMutatorTest.html |    14 +-
 .../PerformanceEvaluation.CASTableTest.html     |    14 +-
 ...erformanceEvaluation.CheckAndDeleteTest.html |     8 +-
 ...erformanceEvaluation.CheckAndMutateTest.html |     8 +-
 .../PerformanceEvaluation.CheckAndPutTest.html  |     8 +-
 .../PerformanceEvaluation.FilteredScanTest.html |    12 +-
 .../PerformanceEvaluation.IncrementTest.html    |     8 +-
 .../PerformanceEvaluation.RandomReadTest.html   |    18 +-
 ...Evaluation.RandomScanWithRange10000Test.html |     8 +-
 ...eEvaluation.RandomScanWithRange1000Test.html |     8 +-
 ...ceEvaluation.RandomScanWithRange100Test.html |     8 +-
 ...nceEvaluation.RandomScanWithRange10Test.html |     8 +-
 ...manceEvaluation.RandomScanWithRangeTest.html |    14 +-
 ...erformanceEvaluation.RandomSeekScanTest.html |    10 +-
 .../PerformanceEvaluation.RandomWriteTest.html  |     8 +-
 .../hbase/PerformanceEvaluation.ScanTest.html   |    12 +-
 ...erformanceEvaluation.SequentialReadTest.html |     8 +-
 ...rformanceEvaluation.SequentialWriteTest.html |     8 +-
 .../hbase/PerformanceEvaluation.TableTest.html  |    12 +-
 .../hbase/PerformanceEvaluation.Test.html       |    12 +-
 .../hbase/PerformanceEvaluation.TestBase.html   |   149 +-
 .../hadoop/hbase/PerformanceEvaluation.html     |    75 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     2 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    10 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     2 +-
 .../hadoop/hbase/regionserver/package-tree.html |     6 +-
 .../apache/hadoop/hbase/test/package-tree.html  |     4 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     2 +-
 .../hbase/PerformanceEvaluation.AppendTest.html |  3339 +-
 ...rformanceEvaluation.AsyncRandomReadTest.html |  3339 +-
 ...formanceEvaluation.AsyncRandomWriteTest.html |  3339 +-
 .../PerformanceEvaluation.AsyncScanTest.html    |  3339 +-
 ...manceEvaluation.AsyncSequentialReadTest.html |  3339 +-
 ...anceEvaluation.AsyncSequentialWriteTest.html |  3339 +-
 .../PerformanceEvaluation.AsyncTableTest.html   |  3339 +-
 .../hbase/PerformanceEvaluation.AsyncTest.html  |  3339 +-
 ...rformanceEvaluation.BufferedMutatorTest.html |  3339 +-
 .../PerformanceEvaluation.CASTableTest.html     |  3339 +-
 ...erformanceEvaluation.CheckAndDeleteTest.html |  3339 +-
 ...erformanceEvaluation.CheckAndMutateTest.html |  3339 +-
 .../PerformanceEvaluation.CheckAndPutTest.html  |  3339 +-
 .../PerformanceEvaluation.CmdDescriptor.html    |  3339 +-
 .../hbase/PerformanceEvaluation.Counter.html    |  3339 +-
 ...PerformanceEvaluation.EvaluationMapTask.html |  3339 +-
 .../PerformanceEvaluation.FilteredScanTest.html |  3339 +-
 .../PerformanceEvaluation.IncrementTest.html    |  3339 +-
 .../PerformanceEvaluation.RandomReadTest.html   |  3339 +-
 ...Evaluation.RandomScanWithRange10000Test.html |  3339 +-
 ...eEvaluation.RandomScanWithRange1000Test.html |  3339 +-
 ...ceEvaluation.RandomScanWithRange100Test.html |  3339 +-
 ...nceEvaluation.RandomScanWithRange10Test.html |  3339 +-
 ...manceEvaluation.RandomScanWithRangeTest.html |  3339 +-
 ...erformanceEvaluation.RandomSeekScanTest.html |  3339 +-
 .../PerformanceEvaluation.RandomWriteTest.html  |  3339 +-
 .../hbase/PerformanceEvaluation.RunResult.html  |  3339 +-
 .../hbase/PerformanceEvaluation.ScanTest.html   |  3339 +-
 ...erformanceEvaluation.SequentialReadTest.html |  3339 +-
 ...rformanceEvaluation.SequentialWriteTest.html |  3339 +-
 .../hbase/PerformanceEvaluation.Status.html     |  3339 +-
 .../hbase/PerformanceEvaluation.TableTest.html  |  3339 +-
 .../hbase/PerformanceEvaluation.Test.html       |  3339 +-
 .../hbase/PerformanceEvaluation.TestBase.html   |  3339 +-
 .../PerformanceEvaluation.TestOptions.html      |  3339 +-
 .../hadoop/hbase/PerformanceEvaluation.html     |  3339 +-
 147 files changed, 97358 insertions(+), 93515 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index d539dd3..5349f3f 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 2179dff..6add424 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:20180504142952+00'00')
-/CreationDate (D:20180504144449+00'00')
+/ModDate (D:20180505143250+00'00')
+/CreationDate (D:20180505144900+00'00')
 >>
 endobj
 2 0 obj

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index 4844a86..e922745 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-04 14:29:52 UTC
+Last updated 2018-05-05 14:32:50 UTC
 </div>
 </div>
 </body>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index 4240b1f..63ab198 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 


[18/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      if (this.testScanner != null)

<TRUNCATED>

[23/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      if (

<TRUNCATED>

[14/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>

<TRUNCATED>

[36/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 e2b381d..379ef34 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.1505">PerformanceEvaluation.AsyncSequentialWriteTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1582">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>
@@ -220,7 +220,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result
 :A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hb
 ase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1506">AsyncSequentialWriteTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html#line.1583">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.1511">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html#line.1588">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/f2065178/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 cfcf2af..271bda9 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.1306">PerformanceEvaluation.AsyncTableTest</a>
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1373">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>
@@ -220,7 +220,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testRow-int-">testRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/a
 pache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testRow-int-">testRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="
 ../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1307">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.1374">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.1309">AsyncTableTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html#line.1376">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.1314">onStartup</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html#line.1381">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.1319">onTakedown</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html#line.1386">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/f2065178/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 a216f74..e8505f8 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.1261">PerformanceEvaluation.AsyncTest</a>
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1328">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>
@@ -201,7 +201,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestB
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#onStartup--">onStartup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#onTakedown--">onTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testRow-int-">testRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateV
 alueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#onStartup--">onStartup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#onTakedown--">onTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testRow-int-">testRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateS
 canMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1262">connection</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.client.AsyncConnection <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html#line.1329">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.1264">AsyncTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html#line.1331">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.1270">createConnection</a>()</pre>
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html#line.1337">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.1281">closeConnection</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html#line.1348">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/f2065178/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 4316026..3b5ab65 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.1542">PerformanceEvaluation.BufferedMutatorTest</a>
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1619">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>
@@ -224,7 +224,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testRow-int-">testRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/a
 pache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testRow-int-">testRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="
 ../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1543">mutator</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.client.BufferedMutator <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1620">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.1544">table</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.client.Table <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1621">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.1546">BufferedMutatorTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1623">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.1551">onStartup</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1628">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.1557">onTakedown</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1634">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/f2065178/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 ff4bb3f..7b42158 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.1834">PerformanceEvaluation.CASTableTest</a>
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1931">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.
@@ -249,7 +249,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase
 .html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testRow-int-">testRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase
 .html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testRow-int-">testRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase
 .html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1835">qualifier</a></pre>
+<pre>private final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1932">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.1836">CASTableTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1933">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.1841">getQualifier</a>()</pre>
+<pre>byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1938">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.1846">getStartRow</a>()</pre>
+<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1943">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.1851">getLastRow</a>()</pre>
+<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1948">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/f2065178/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 33d9040..38617d1 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.1919">PerformanceEvaluation.CheckAndDeleteTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2016">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>
@@ -232,7 +232,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase
 .html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase
 .html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1920">CheckAndDeleteTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html#line.2017">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.1925">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html#line.2022">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/f2065178/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 5300a40..504b463 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.1883">PerformanceEvaluation.CheckAndMutateTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1980">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>
@@ -232,7 +232,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase
 .html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase
 .html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1884">CheckAndMutateTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html#line.1981">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.1889">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html#line.1986">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/f2065178/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 6c57a97..da72b36 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.1902">PerformanceEvaluation.CheckAndPutTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1999">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>
@@ -232,7 +232,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase
 .html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase
 .html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1903">CheckAndPutTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html#line.2000">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.1908">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html#line.2005">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/f2065178/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 7b97cfe..d458b39 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.1993">PerformanceEvaluation.FilteredScanTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2093">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>
@@ -235,7 +235,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result
 :A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hb
 ase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1994">LOG</a></pre>
+<pre>protected static final&nbsp;org.slf4j.Logger <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.2094">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.1996">FilteredScanTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.2096">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.2001">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.2101">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.2015">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.2118">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/f2065178/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 b909007..f7431f3 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.1856">PerformanceEvaluation.IncrementTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1953">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>
@@ -232,7 +232,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase
 .html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase
 .html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1857">IncrementTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html#line.1954">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.1862">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.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>


[43/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.DefaultVisitorBase.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.DefaultVisitorBase.html b/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.DefaultVisitorBase.html
index cdd2f36..fea2b5a 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.DefaultVisitorBase.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.DefaultVisitorBase.html
@@ -151,2029 +151,2019 @@
 <span class="sourceLineNo">143</span>  private static final Logger LOG = LoggerFactory.getLogger(MetaTableAccessor.class);<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  private static final Logger METALOG = LoggerFactory.getLogger("org.apache.hadoop.hbase.META");<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final byte[] META_REGION_PREFIX;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  static {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    // Copy the prefix from FIRST_META_REGIONINFO into META_REGION_PREFIX.<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    // FIRST_META_REGIONINFO == 'hbase:meta,,1'.  META_REGION_PREFIX == 'hbase:meta,'<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    int len = RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName().length - 2;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    META_REGION_PREFIX = new byte [len];<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    System.arraycopy(RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName(), 0,<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      META_REGION_PREFIX, 0, len);<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>  @VisibleForTesting<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  public static final byte[] REPLICATION_PARENT_QUALIFIER = Bytes.toBytes("parent");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private static final byte ESCAPE_BYTE = (byte) 0xFF;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  private static final byte SEPARATED_BYTE = 0x00;<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>  /**<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * Lists all of the table regions currently in META.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   * Deprecated, keep there until some test use this.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @param connection what we will use<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * @param tableName table to list<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * @return Map of all user-space regions to servers<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   * @deprecated use {@link #getTableRegionsAndLocations}, region can have multiple locations<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  @Deprecated<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  public static NavigableMap&lt;RegionInfo, ServerName&gt; allTableRegions(<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      Connection connection, final TableName tableName) throws IOException {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    final NavigableMap&lt;RegionInfo, ServerName&gt; regions = new TreeMap&lt;&gt;();<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    Visitor visitor = new TableVisitorBase(tableName) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      @Override<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      public boolean visitInternal(Result result) throws IOException {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>        RegionLocations locations = getRegionLocations(result);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        if (locations == null) return true;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>          if (loc != null) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>            RegionInfo regionInfo = loc.getRegionInfo();<a name="line.182"></a>
-<span class="sourceLineNo">183</span>            regions.put(regionInfo, loc.getServerName());<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>        return true;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    };<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    scanMetaForTableRegions(connection, visitor, tableName);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    return regions;<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>  @InterfaceAudience.Private<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public enum QueryType {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    ALL(HConstants.TABLE_FAMILY, HConstants.CATALOG_FAMILY),<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    REGION(HConstants.CATALOG_FAMILY),<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    TABLE(HConstants.TABLE_FAMILY),<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    REPLICATION(HConstants.REPLICATION_BARRIER_FAMILY);<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>    private final byte[][] families;<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>    QueryType(byte[]... families) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      this.families = families;<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>    byte[][] getFamilies() {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      return this.families;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  }<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span>  /** The delimiter for meta columns for replicaIds &amp;gt; 0 */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  protected static final char META_REPLICA_ID_DELIMITER = '_';<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>  /** A regex for parsing server columns from meta. See above javadoc for meta layout */<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  private static final Pattern SERVER_COLUMN_PATTERN<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    = Pattern.compile("^server(_[0-9a-fA-F]{4})?$");<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>  ////////////////////////<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  // Reading operations //<a name="line.219"></a>
-<span class="sourceLineNo">220</span>  ////////////////////////<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.223"></a>
-<span class="sourceLineNo">224</span>   * @param connection connection we're using<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * @param visitor Visitor invoked against each row in regions family.<a name="line.225"></a>
+<span class="sourceLineNo">146</span>  @VisibleForTesting<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  public static final byte[] REPLICATION_PARENT_QUALIFIER = Bytes.toBytes("parent");<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final byte ESCAPE_BYTE = (byte) 0xFF;<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final byte SEPARATED_BYTE = 0x00;<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  /**<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * Lists all of the table regions currently in META.<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * Deprecated, keep there until some test use this.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   * @param connection what we will use<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   * @param tableName table to list<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   * @return Map of all user-space regions to servers<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   * @deprecated use {@link #getTableRegionsAndLocations}, region can have multiple locations<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   */<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  @Deprecated<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  public static NavigableMap&lt;RegionInfo, ServerName&gt; allTableRegions(<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      Connection connection, final TableName tableName) throws IOException {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    final NavigableMap&lt;RegionInfo, ServerName&gt; regions = new TreeMap&lt;&gt;();<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    Visitor visitor = new TableVisitorBase(tableName) {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      @Override<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      public boolean visitInternal(Result result) throws IOException {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        RegionLocations locations = getRegionLocations(result);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        if (locations == null) return true;<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>          if (loc != null) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>            RegionInfo regionInfo = loc.getRegionInfo();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>            regions.put(regionInfo, loc.getServerName());<a name="line.173"></a>
+<span class="sourceLineNo">174</span>          }<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>        return true;<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      }<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    };<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    scanMetaForTableRegions(connection, visitor, tableName);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    return regions;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>  @InterfaceAudience.Private<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  public enum QueryType {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    ALL(HConstants.TABLE_FAMILY, HConstants.CATALOG_FAMILY),<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    REGION(HConstants.CATALOG_FAMILY),<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    TABLE(HConstants.TABLE_FAMILY),<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    REPLICATION(HConstants.REPLICATION_BARRIER_FAMILY);<a name="line.188"></a>
+<span class="sourceLineNo">189</span><a name="line.189"></a>
+<span class="sourceLineNo">190</span>    private final byte[][] families;<a name="line.190"></a>
+<span class="sourceLineNo">191</span><a name="line.191"></a>
+<span class="sourceLineNo">192</span>    QueryType(byte[]... families) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      this.families = families;<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>    byte[][] getFamilies() {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      return this.families;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  }<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>  /** The delimiter for meta columns for replicaIds &amp;gt; 0 */<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  protected static final char META_REPLICA_ID_DELIMITER = '_';<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>  /** A regex for parsing server columns from meta. See above javadoc for meta layout */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  private static final Pattern SERVER_COLUMN_PATTERN<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    = Pattern.compile("^server(_[0-9a-fA-F]{4})?$");<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>  ////////////////////////<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  // Reading operations //<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  ////////////////////////<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>  /**<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * @param connection connection we're using<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * @param visitor Visitor invoked against each row in regions family.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   */<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  public static void fullScanRegions(Connection connection,<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      final Visitor visitor)<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      throws IOException {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    scanMeta(connection, null, null, QueryType.REGION, visitor);<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>  /**<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   * @param connection connection we're using<a name="line.225"></a>
 <span class="sourceLineNo">226</span>   */<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  public static void fullScanRegions(Connection connection,<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      final Visitor visitor)<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      throws IOException {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    scanMeta(connection, null, null, QueryType.REGION, visitor);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   * @param connection connection we're using<a name="line.235"></a>
+<span class="sourceLineNo">227</span>  public static List&lt;Result&gt; fullScanRegions(Connection connection)<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      throws IOException {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    return fullScan(connection, QueryType.REGION);<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>  /**<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for tables.<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * @param connection connection we're using<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * @param visitor Visitor invoked against each row in tables family.<a name="line.235"></a>
 <span class="sourceLineNo">236</span>   */<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  public static List&lt;Result&gt; fullScanRegions(Connection connection)<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      throws IOException {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    return fullScan(connection, QueryType.REGION);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for tables.<a name="line.243"></a>
-<span class="sourceLineNo">244</span>   * @param connection connection we're using<a name="line.244"></a>
-<span class="sourceLineNo">245</span>   * @param visitor Visitor invoked against each row in tables family.<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   */<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  public static void fullScanTables(Connection connection,<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      final Visitor visitor)<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      throws IOException {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    scanMeta(connection, null, null, QueryType.TABLE, visitor);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt;.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * @param connection connection we're using<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   * @param type scanned part of meta<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * @return List of {@link Result}<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  public static List&lt;Result&gt; fullScan(Connection connection, QueryType type)<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    throws IOException {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    CollectAllVisitor v = new CollectAllVisitor();<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    scanMeta(connection, null, null, type, v);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    return v.getResults();<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>  /**<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * Callers should call close on the returned {@link Table} instance.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * @param connection connection we're using to access Meta<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   * @return An {@link Table} for &lt;code&gt;hbase:meta&lt;/code&gt;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  public static Table getMetaHTable(final Connection connection)<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  throws IOException {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    // We used to pass whole CatalogTracker in here, now we just pass in Connection<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    if (connection == null) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      throw new NullPointerException("No connection");<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    } else if (connection.isClosed()) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      throw new IOException("connection is closed");<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    return connection.getTable(TableName.META_TABLE_NAME);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * @param t Table to use (will be closed when done).<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * @param g Get to run<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   */<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  private static Result get(final Table t, final Get g) throws IOException {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    if (t == null) return null;<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    try {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      return t.get(g);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    } finally {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      t.close();<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  /**<a name="line.295"></a>
-<span class="sourceLineNo">296</span>   * Gets the region info and assignment for the specified region.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   * @param connection connection we're using<a name="line.297"></a>
-<span class="sourceLineNo">298</span>   * @param regionName Region to lookup.<a name="line.298"></a>
-<span class="sourceLineNo">299</span>   * @return Location and RegionInfo for &lt;code&gt;regionName&lt;/code&gt;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * @deprecated use {@link #getRegionLocation(Connection, byte[])} instead<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  @Deprecated<a name="line.302"></a>
-<span class="sourceLineNo">303</span>  public static Pair&lt;RegionInfo, ServerName&gt; getRegion(Connection connection, byte [] regionName)<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    throws IOException {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    HRegionLocation location = getRegionLocation(connection, regionName);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    return location == null<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      ? null<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      : new Pair&lt;&gt;(location.getRegionInfo(), location.getServerName());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  /**<a name="line.311"></a>
-<span class="sourceLineNo">312</span>   * Returns the HRegionLocation from meta for the given region<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * @param connection connection we're using<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   * @param regionName region we're looking for<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   * @return HRegionLocation for the given region<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   */<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  public static HRegionLocation getRegionLocation(Connection connection, byte[] regionName)<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      throws IOException {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    byte[] row = regionName;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    RegionInfo parsedInfo = null;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    try {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      parsedInfo = parseRegionInfoFromRegionName(regionName);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      row = getMetaKeyForRegion(parsedInfo);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    } catch (Exception parseEx) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      // Ignore. This is used with tableName passed as regionName.<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    Get get = new Get(row);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    Result r = get(getMetaHTable(connection), get);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    RegionLocations locations = getRegionLocations(r);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    return locations == null ? null<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      : locations.getRegionLocation(parsedInfo == null ? 0 : parsedInfo.getReplicaId());<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  }<a name="line.333"></a>
-<span class="sourceLineNo">334</span><a name="line.334"></a>
-<span class="sourceLineNo">335</span>  /**<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   * Returns the HRegionLocation from meta for the given region<a name="line.336"></a>
-<span class="sourceLineNo">337</span>   * @param connection connection we're using<a name="line.337"></a>
-<span class="sourceLineNo">338</span>   * @param regionInfo region information<a name="line.338"></a>
-<span class="sourceLineNo">339</span>   * @return HRegionLocation for the given region<a name="line.339"></a>
-<span class="sourceLineNo">340</span>   */<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  public static HRegionLocation getRegionLocation(Connection connection, RegionInfo regionInfo)<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throws IOException {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    byte[] row = getMetaKeyForRegion(regionInfo);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    Get get = new Get(row);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    Result r = get(getMetaHTable(connection), get);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    return getRegionLocation(r, regionInfo, regionInfo.getReplicaId());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  }<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  /** Returns the row key to use for this regionInfo */<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  public static byte[] getMetaKeyForRegion(RegionInfo regionInfo) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    return RegionReplicaUtil.getRegionInfoForDefaultReplica(regionInfo).getRegionName();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  }<a name="line.353"></a>
-<span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>  /** Returns an HRI parsed from this regionName. Not all the fields of the HRI<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * is stored in the name, so the returned object should only be used for the fields<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   * in the regionName.<a name="line.357"></a>
-<span class="sourceLineNo">358</span>   */<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  public static RegionInfo parseRegionInfoFromRegionName(byte[] regionName) throws IOException {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    byte[][] fields = RegionInfo.parseRegionName(regionName);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    long regionId = Long.parseLong(Bytes.toString(fields[2]));<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    int replicaId = fields.length &gt; 3 ? Integer.parseInt(Bytes.toString(fields[3]), 16) : 0;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    return RegionInfoBuilder.newBuilder(TableName.valueOf(fields[0]))<a name="line.363"></a>
-<span class="sourceLineNo">364</span>              .setStartKey(fields[1])<a name="line.364"></a>
-<span class="sourceLineNo">365</span>              .setEndKey(fields[2])<a name="line.365"></a>
-<span class="sourceLineNo">366</span>              .setSplit(false)<a name="line.366"></a>
-<span class="sourceLineNo">367</span>              .setRegionId(regionId)<a name="line.367"></a>
-<span class="sourceLineNo">368</span>              .setReplicaId(replicaId)<a name="line.368"></a>
-<span class="sourceLineNo">369</span>              .build();<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>  /**<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * Gets the result in hbase:meta for the specified region.<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * @param connection connection we're using<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * @param regionName region we're looking for<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * @return result of the specified region<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   */<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public static Result getRegionResult(Connection connection,<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      byte[] regionName) throws IOException {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    Get get = new Get(regionName);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    return get(getMetaHTable(connection), get);<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>   * Get regions from the merge qualifier of the specified merged region<a name="line.386"></a>
-<span class="sourceLineNo">387</span>   * @return null if it doesn't contain merge qualifier, else two merge regions<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   */<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  @Nullable<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  public static Pair&lt;RegionInfo, RegionInfo&gt; getRegionsFromMergeQualifier(<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      Connection connection, byte[] regionName) throws IOException {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Result result = getRegionResult(connection, regionName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    RegionInfo mergeA = getRegionInfo(result, HConstants.MERGEA_QUALIFIER);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    RegionInfo mergeB = getRegionInfo(result, HConstants.MERGEB_QUALIFIER);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    if (mergeA == null &amp;&amp; mergeB == null) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      return null;<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    }<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    return new Pair&lt;&gt;(mergeA, mergeB);<a name="line.398"></a>
-<span class="sourceLineNo">399</span> }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>  /**<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * Checks if the specified table exists.  Looks at the hbase:meta table hosted on<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   * the specified server.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>   * @param connection connection we're using<a name="line.404"></a>
-<span class="sourceLineNo">405</span>   * @param tableName table to check<a name="line.405"></a>
-<span class="sourceLineNo">406</span>   * @return true if the table exists in meta, false if not<a name="line.406"></a>
-<span class="sourceLineNo">407</span>   */<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public static boolean tableExists(Connection connection,<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      final TableName tableName)<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  throws IOException {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // Catalog tables always exist.<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return tableName.equals(TableName.META_TABLE_NAME)<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        || getTableState(connection, tableName) != null;<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>   * Lists all of the regions currently in META.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   *<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   * @param connection to connect with<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   * @param excludeOfflinedSplitParents False if we are to include offlined/splitparents regions,<a name="line.420"></a>
-<span class="sourceLineNo">421</span>   *                                    true and we'll leave out offlined regions from returned list<a name="line.421"></a>
-<span class="sourceLineNo">422</span>   * @return List of all user-space regions.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   */<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  @VisibleForTesting<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  public static List&lt;RegionInfo&gt; getAllRegions(Connection connection,<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      boolean excludeOfflinedSplitParents)<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      throws IOException {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result;<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>    result = getTableRegionsAndLocations(connection, null,<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        excludeOfflinedSplitParents);<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>    return getListOfRegionInfos(result);<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  /**<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * @param connection connection we're using<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * @param tableName table we're looking for<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   */<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName)<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  throws IOException {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return getTableRegions(connection, tableName, false);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  /**<a name="line.449"></a>
-<span class="sourceLineNo">450</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.450"></a>
-<span class="sourceLineNo">451</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * @param connection connection we're using<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   * @param tableName table we're looking for<a name="line.453"></a>
-<span class="sourceLineNo">454</span>   * @param excludeOfflinedSplitParents If true, do not include offlined split<a name="line.454"></a>
-<span class="sourceLineNo">455</span>   * parents in the return.<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   */<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName,<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result =<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      getTableRegionsAndLocations(connection, tableName, excludeOfflinedSplitParents);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    return getListOfRegionInfos(result);<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>  private static List&lt;RegionInfo&gt; getListOfRegionInfos(<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      final List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    if (pairs == null || pairs.isEmpty()) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      return Collections.emptyList();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    List&lt;RegionInfo&gt; result = new ArrayList&lt;&gt;(pairs.size());<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      result.add(pair.getFirst());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    return result;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  }<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>  /**<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * @param tableName table we're working with<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * @return start row for scanning META according to query type<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   */<a name="line.480"></a>
-<span class="sourceLineNo">481</span>  public static byte[] getTableStartRowForMeta(TableName tableName, QueryType type) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    if (tableName == null) {<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      return null;<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    switch (type) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    case REGION:<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      byte[] startRow = new byte[tableName.getName().length + 2];<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      System.arraycopy(tableName.getName(), 0, startRow, 0, tableName.getName().length);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      startRow[startRow.length - 2] = HConstants.DELIMITER;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      startRow[startRow.length - 1] = HConstants.DELIMITER;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      return startRow;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    case ALL:<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    case TABLE:<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    default:<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      return tableName.getName();<a name="line.495"></a>
+<span class="sourceLineNo">237</span>  public static void fullScanTables(Connection connection,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      final Visitor visitor)<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      throws IOException {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    scanMeta(connection, null, null, QueryType.TABLE, visitor);<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>  /**<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt;.<a name="line.244"></a>
+<span class="sourceLineNo">245</span>   * @param connection connection we're using<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   * @param type scanned part of meta<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * @return List of {@link Result}<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   */<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  public static List&lt;Result&gt; fullScan(Connection connection, QueryType type)<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    throws IOException {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    CollectAllVisitor v = new CollectAllVisitor();<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    scanMeta(connection, null, null, type, v);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    return v.getResults();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  /**<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * Callers should call close on the returned {@link Table} instance.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * @param connection connection we're using to access Meta<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * @return An {@link Table} for &lt;code&gt;hbase:meta&lt;/code&gt;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  public static Table getMetaHTable(final Connection connection)<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  throws IOException {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    // We used to pass whole CatalogTracker in here, now we just pass in Connection<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    if (connection == null) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      throw new NullPointerException("No connection");<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    } else if (connection.isClosed()) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      throw new IOException("connection is closed");<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    return connection.getTable(TableName.META_TABLE_NAME);<a name="line.269"></a>
+<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  /**<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * @param t Table to use (will be closed when done).<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   * @param g Get to run<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  private static Result get(final Table t, final Get g) throws IOException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    if (t == null) return null;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    try {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      return t.get(g);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    } finally {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      t.close();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  }<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * Gets the region info and assignment for the specified region.<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * @param connection connection we're using<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * @param regionName Region to lookup.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * @return Location and RegionInfo for &lt;code&gt;regionName&lt;/code&gt;<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * @deprecated use {@link #getRegionLocation(Connection, byte[])} instead<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   */<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  @Deprecated<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  public static Pair&lt;RegionInfo, ServerName&gt; getRegion(Connection connection, byte [] regionName)<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    throws IOException {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    HRegionLocation location = getRegionLocation(connection, regionName);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    return location == null<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      ? null<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      : new Pair&lt;&gt;(location.getRegionInfo(), location.getServerName());<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>  /**<a name="line.301"></a>
+<span class="sourceLineNo">302</span>   * Returns the HRegionLocation from meta for the given region<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * @param connection connection we're using<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * @param regionName region we're looking for<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * @return HRegionLocation for the given region<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   */<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  public static HRegionLocation getRegionLocation(Connection connection, byte[] regionName)<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      throws IOException {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    byte[] row = regionName;<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    RegionInfo parsedInfo = null;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    try {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      parsedInfo = parseRegionInfoFromRegionName(regionName);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      row = getMetaKeyForRegion(parsedInfo);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    } catch (Exception parseEx) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      // Ignore. This is used with tableName passed as regionName.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    Get get = new Get(row);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    Result r = get(getMetaHTable(connection), get);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    RegionLocations locations = getRegionLocations(r);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return locations == null ? null<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      : locations.getRegionLocation(parsedInfo == null ? 0 : parsedInfo.getReplicaId());<a name="line.322"></a>
+<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
+<span class="sourceLineNo">324</span><a name="line.324"></a>
+<span class="sourceLineNo">325</span>  /**<a name="line.325"></a>
+<span class="sourceLineNo">326</span>   * Returns the HRegionLocation from meta for the given region<a name="line.326"></a>
+<span class="sourceLineNo">327</span>   * @param connection connection we're using<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   * @param regionInfo region information<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   * @return HRegionLocation for the given region<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   */<a name="line.330"></a>
+<span class="sourceLineNo">331</span>  public static HRegionLocation getRegionLocation(Connection connection, RegionInfo regionInfo)<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      throws IOException {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    byte[] row = getMetaKeyForRegion(regionInfo);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    Get get = new Get(row);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    Result r = get(getMetaHTable(connection), get);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    return getRegionLocation(r, regionInfo, regionInfo.getReplicaId());<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  }<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  /** Returns the row key to use for this regionInfo */<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  public static byte[] getMetaKeyForRegion(RegionInfo regionInfo) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    return RegionReplicaUtil.getRegionInfoForDefaultReplica(regionInfo).getRegionName();<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  /** Returns an HRI parsed from this regionName. Not all the fields of the HRI<a name="line.345"></a>
+<span class="sourceLineNo">346</span>   * is stored in the name, so the returned object should only be used for the fields<a name="line.346"></a>
+<span class="sourceLineNo">347</span>   * in the regionName.<a name="line.347"></a>
+<span class="sourceLineNo">348</span>   */<a name="line.348"></a>
+<span class="sourceLineNo">349</span>  public static RegionInfo parseRegionInfoFromRegionName(byte[] regionName) throws IOException {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    byte[][] fields = RegionInfo.parseRegionName(regionName);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    long regionId = Long.parseLong(Bytes.toString(fields[2]));<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    int replicaId = fields.length &gt; 3 ? Integer.parseInt(Bytes.toString(fields[3]), 16) : 0;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    return RegionInfoBuilder.newBuilder(TableName.valueOf(fields[0]))<a name="line.353"></a>
+<span class="sourceLineNo">354</span>              .setStartKey(fields[1])<a name="line.354"></a>
+<span class="sourceLineNo">355</span>              .setEndKey(fields[2])<a name="line.355"></a>
+<span class="sourceLineNo">356</span>              .setSplit(false)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>              .setRegionId(regionId)<a name="line.357"></a>
+<span class="sourceLineNo">358</span>              .setReplicaId(replicaId)<a name="line.358"></a>
+<span class="sourceLineNo">359</span>              .build();<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  }<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * Gets the result in hbase:meta for the specified region.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   * @param connection connection we're using<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   * @param regionName region we're looking for<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   * @return result of the specified region<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
+<span class="sourceLineNo">368</span>  public static Result getRegionResult(Connection connection,<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      byte[] regionName) throws IOException {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    Get get = new Get(regionName);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    return get(getMetaHTable(connection), get);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>  }<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>   * Get regions from the merge qualifier of the specified merged region<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * @return null if it doesn't contain merge qualifier, else two merge regions<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   */<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  @Nullable<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  public static Pair&lt;RegionInfo, RegionInfo&gt; getRegionsFromMergeQualifier(<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      Connection connection, byte[] regionName) throws IOException {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    Result result = getRegionResult(connection, regionName);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    RegionInfo mergeA = getRegionInfo(result, HConstants.MERGEA_QUALIFIER);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    RegionInfo mergeB = getRegionInfo(result, HConstants.MERGEB_QUALIFIER);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (mergeA == null &amp;&amp; mergeB == null) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return null;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    return new Pair&lt;&gt;(mergeA, mergeB);<a name="line.388"></a>
+<span class="sourceLineNo">389</span> }<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>   * Checks if the specified table exists.  Looks at the hbase:meta table hosted on<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * the specified server.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * @param connection connection we're using<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @param tableName table to check<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   * @return true if the table exists in meta, false if not<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   */<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  public static boolean tableExists(Connection connection,<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      final TableName tableName)<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  throws IOException {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // Catalog tables always exist.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    return tableName.equals(TableName.META_TABLE_NAME)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || getTableState(connection, tableName) != null;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  /**<a name="line.406"></a>
+<span class="sourceLineNo">407</span>   * Lists all of the regions currently in META.<a name="line.407"></a>
+<span class="sourceLineNo">408</span>   *<a name="line.408"></a>
+<span class="sourceLineNo">409</span>   * @param connection to connect with<a name="line.409"></a>
+<span class="sourceLineNo">410</span>   * @param excludeOfflinedSplitParents False if we are to include offlined/splitparents regions,<a name="line.410"></a>
+<span class="sourceLineNo">411</span>   *                                    true and we'll leave out offlined regions from returned list<a name="line.411"></a>
+<span class="sourceLineNo">412</span>   * @return List of all user-space regions.<a name="line.412"></a>
+<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
+<span class="sourceLineNo">414</span>  @VisibleForTesting<a name="line.414"></a>
+<span class="sourceLineNo">415</span>  public static List&lt;RegionInfo&gt; getAllRegions(Connection connection,<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      boolean excludeOfflinedSplitParents)<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      throws IOException {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result;<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    result = getTableRegionsAndLocations(connection, null,<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        excludeOfflinedSplitParents);<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>    return getListOfRegionInfos(result);<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>  }<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>  /**<a name="line.427"></a>
+<span class="sourceLineNo">428</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.428"></a>
+<span class="sourceLineNo">429</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.429"></a>
+<span class="sourceLineNo">430</span>   * @param connection connection we're using<a name="line.430"></a>
+<span class="sourceLineNo">431</span>   * @param tableName table we're looking for<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName)<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  throws IOException {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    return getTableRegions(connection, tableName, false);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  }<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>   * Gets all of the regions of the specified table. Do not use this method<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   * @param connection connection we're using<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @param tableName table we're looking for<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   * @param excludeOfflinedSplitParents If true, do not include offlined split<a name="line.444"></a>
+<span class="sourceLineNo">445</span>   * parents in the return.<a name="line.445"></a>
+<span class="sourceLineNo">446</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>   */<a name="line.447"></a>
+<span class="sourceLineNo">448</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName,<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result =<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      getTableRegionsAndLocations(connection, tableName, excludeOfflinedSplitParents);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    return getListOfRegionInfos(result);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  private static List&lt;RegionInfo&gt; getListOfRegionInfos(<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      final List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs) {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    if (pairs == null || pairs.isEmpty()) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      return Collections.emptyList();<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    List&lt;RegionInfo&gt; result = new ArrayList&lt;&gt;(pairs.size());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      result.add(pair.getFirst());<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    return result;<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>  /**<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * @param tableName table we're working with<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * @return start row for scanning META according to query type<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   */<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  public static byte[] getTableStartRowForMeta(TableName tableName, QueryType type) {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    if (tableName == null) {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      return null;<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    switch (type) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    case REGION:<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      byte[] startRow = new byte[tableName.getName().length + 2];<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      System.arraycopy(tableName.getName(), 0, startRow, 0, tableName.getName().length);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      startRow[startRow.length - 2] = HConstants.DELIMITER;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      startRow[startRow.length - 1] = HConstants.DELIMITER;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      return startRow;<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    case ALL:<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    case TABLE:<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    default:<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      return tableName.getName();<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    }<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>  /**<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * @param tableName table we're working with<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   * @return stop row for scanning META according to query type<a name="line.491"></a>
+<span class="sourceLineNo">492</span>   */<a name="line.492"></a>
+<span class="sourceLineNo">493</span>  public static byte[] getTableStopRowForMeta(TableName tableName, QueryType type) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    if (tableName == null) {<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return null;<a name="line.495"></a>
 <span class="sourceLineNo">496</span>    }<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>  /**<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   * @param tableName table we're working with<a name="line.500"></a>
-<span class="sourceLineNo">501</span>   * @return stop row for scanning META according to query type<a name="line.501"></a>
-<span class="sourceLineNo">502</span>   */<a name="line.502"></a>
-<span class="sourceLineNo">503</span>  public static byte[] getTableStopRowForMeta(TableName tableName, QueryType type) {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    if (tableName == null) {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      return null;<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    }<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    final byte[] stopRow;<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    switch (type) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    case REGION:<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      stopRow = new byte[tableName.getName().length + 3];<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      System.arraycopy(tableName.getName(), 0, stopRow, 0, tableName.getName().length);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      stopRow[stopRow.length - 3] = ' ';<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      stopRow[stopRow.length - 2] = HConstants.DELIMITER;<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      stopRow[stopRow.length - 1] = HConstants.DELIMITER;<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      break;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    case ALL:<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    case TABLE:<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    default:<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      stopRow = new byte[tableName.getName().length + 1];<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      System.arraycopy(tableName.getName(), 0, stopRow, 0, tableName.getName().length);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      stopRow[stopRow.length - 1] = ' ';<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      break;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    }<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    return stopRow;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * This method creates a Scan object that will only scan catalog rows that<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   * belong to the specified table. It doesn't specify any columns.<a name="line.529"></a>
-<span class="sourceLineNo">530</span>   * This is a better alternative to just using a start row and scan until<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * it hits a new table since that requires parsing the HRI to get the table<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   * name.<a name="line.532"></a>
-<span class="sourceLineNo">533</span>   * @param tableName bytes of table's name<a name="line.533"></a>
-<span class="sourceLineNo">534</span>   * @return configured Scan object<a name="line.534"></a>
-<span class="sourceLineNo">535</span>   */<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  @Deprecated<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  public static Scan getScanForTableName(Connection connection, TableName tableName) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    // Start key is just the table name with delimiters<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    byte[] startKey = getTableStartRowForMeta(tableName, QueryType.REGION);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    // Stop key appends the smallest possible char to the table name<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    byte[] stopKey = getTableStopRowForMeta(tableName, QueryType.REGION);<a name="line.541"></a>
-<span class="sourceLineNo">542</span><a name="line.542"></a>
-<span class="sourceLineNo">543</span>    Scan scan = getMetaScan(connection, -1);<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    scan.setStartRow(startKey);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    scan.setStopRow(stopKey);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    return scan;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>  private static Scan getMetaScan(Connection connection, int rowUpperLimit) {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    Scan scan = new Scan();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    int scannerCaching = connection.getConfiguration()<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        .getInt(HConstants.HBASE_META_SCANNER_CACHING,<a name="line.552"></a>
-<span class="sourceLineNo">553</span>            HConstants.DEFAULT_HBASE_META_SCANNER_CACHING);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    if (connection.getConfiguration().getBoolean(HConstants.USE_META_REPLICAS,<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        HConstants.DEFAULT_USE_META_REPLICAS)) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      scan.setConsistency(Consistency.TIMELINE);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    if (rowUpperLimit &gt; 0) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      scan.setLimit(rowUpperLimit);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      scan.setReadType(Scan.ReadType.PREAD);<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    scan.setCaching(scannerCaching);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    return scan;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  /**<a name="line.565"></a>
-<span class="sourceLineNo">566</span>   * Do not use this method to get meta table regions, use methods in MetaTableLocator instead.<a name="line.566"></a>
-<span class="sourceLineNo">567</span>   * @param connection connection we're using<a name="line.567"></a>
-<span class="sourceLineNo">568</span>   * @param tableName table we're looking for<a name="line.568"></a>
-<span class="sourceLineNo">569</span>   * @return Return list of regioninfos and server.<a name="line.569"></a>
-<span class="sourceLineNo">570</span>   * @throws IOException<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   */<a name="line.571"></a>
-<span class="sourceLineNo">572</span>  public static List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    getTableRegionsAndLocations(Connection connection, TableName tableName)<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      throws IOException {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    return getTableRegionsAndLocations(connection, tableName, true);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>  }<a name="line.576"></a>
-<span class="sourceLineNo">577</span><a name="line.577"></a>
-<span class="sourceLineNo">578</span>  /**<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   * Do not use this method to get meta table regions, use methods in MetaTableLocator instead.<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param connection connection we're using<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param tableName table to work with, can be null for getting all regions<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @param excludeOfflinedSplitParents don't return split parents<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   * @return Return list of regioninfos and server addresses.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   * @throws IOException<a name="line.584"></a>
-<span class="sourceLineNo">585</span>   */<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  public static List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; getTableRegionsAndLocations(<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      Connection connection, @Nullable final TableName tableName,<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    if (tableName != null &amp;&amp; tableName.equals(TableName.META_TABLE_NAME)) {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      throw new IOException("This method can't be used to locate meta regions;"<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        + " use MetaTableLocator instead");<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    }<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    // Make a version of CollectingVisitor that collects RegionInfo and ServerAddress<a name="line.593"></a>
-<span class="sourceLineNo">594</span>    CollectingVisitor&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; visitor =<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      new CollectingVisitor&lt;Pair&lt;RegionInfo, ServerName&gt;&gt;() {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>        private RegionLocations current = null;<a name="line.596"></a>
-<span class="sourceLineNo">597</span><a name="line.597"></a>
-<span class="sourceLineNo">598</span>        @Override<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        public boolean visit(Result r) throws IOException {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>          current = getRegionLocations(r);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          if (current == null || current.getRegionLocation().getRegion() == null) {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>            LOG.warn("No serialized RegionInfo in " + r);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>            return true;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>          }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          RegionInfo hri = current.getRegionLocation().getRegion();<a name="line.605"></a>
-<span class="sourceLineNo">606</span>          if (excludeOfflinedSplitParents &amp;&amp; hri.isSplitParent()) return true;<a name="line.606"></a>
-<span class="sourceLineNo">607</span>          // Else call super and add this Result to the collection.<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          return super.visit(r);<a name="line.608"></a>
-<span class="sourceLineNo">609</span>        }<a name="line.609"></a>
-<span class="sourceLineNo">610</span><a name="line.610"></a>
-<span class="sourceLineNo">611</span>        @Override<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        void add(Result r) {<a name="line.612"></a>
-<span class="sourceLineNo">613</span>          if (current == null) {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>            return;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>          }<a name="line.615"></a>
-<span class="sourceLineNo">616</span>          for (HRegionLocation loc : current.getRegionLocations()) {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>            if (loc != null) {<a name="line.617"></a>
-<span class="sourceLineNo">618</span>              this.results.add(new Pair&lt;&gt;(loc.getRegion(), loc.getServerName()));<a name="line.618"></a>
-<span class="sourceLineNo">619</span>            }<a name="line.619"></a>
-<span class="sourceLineNo">620</span>          }<a name="line.620"></a>
-<span class="sourceLineNo">621</span>        }<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      };<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    scanMeta(connection,<a name="line.623"></a>
-<span class="sourceLineNo">624</span>        getTableStartRowForMeta(tableName, QueryType.REGION),<a name="line.624"></a>
-<span class="sourceLineNo">625</span>        getTableStopRowForMeta(tableName, QueryType.REGION),<a name="line.625"></a>
-<span class="sourceLineNo">626</span>        QueryType.REGION, visitor);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    return visitor.getResults();<a name="line.627"></a>
-<span class="sourceLineNo">628</span>  }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>  /**<a name="line.630"></a>
-<span class="sourceLineNo">631</span>   * @param connection connection we're using<a name="line.631"></a>
-<span class="sourceLineNo">632</span>   * @param serverName server whose regions we're interested in<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * @return List of user regions installed on this server (does not include<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * catalog regions).<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   * @throws IOException<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   */<a name="line.636"></a>
-<span class="sourceLineNo">637</span>  public static NavigableMap&lt;RegionInfo, Result&gt;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>  getServerUserRegions(Connection connection, final ServerName serverName)<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    throws IOException {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    final NavigableMap&lt;RegionInfo, Result&gt; hris = new TreeMap&lt;&gt;();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    // Fill the above hris map with entries from hbase:meta that have the passed<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    // servername.<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    CollectingVisitor&lt;Result&gt; v = new CollectingVisitor&lt;Result&gt;() {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      @Override<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      void add(Result r) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        if (r == null || r.isEmpty()) return;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        RegionLocations locations = getRegionLocations(r);<a name="line.647"></a>
-<span class="sourceLineNo">648</span>        if (locations == null) return;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>          if (loc != null) {<a name="line.650"></a>
-<span class="sourceLineNo">651</span>            if (loc.getServerName() != null &amp;&amp; loc.getServerName().equals(serverName)) {<a name="line.651"></a>
-<span class="sourceLineNo">652</span>              hris.put(loc.getRegion(), r);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>            }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>          }<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    };<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    scanMeta(connection, null, null, QueryType.REGION, v);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    return hris;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>  }<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  public static void fullScanMetaAndPrint(Connection connection)<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    throws IOException {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    Visitor v = new Visitor() {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      @Override<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      public boolean visit(Result r) throws IOException {<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        if (r ==  null || r.isEmpty()) return true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        LOG.info("fullScanMetaAndPrint.Current Meta Row: " + r);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        TableState state = getTableState(r);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (state != null) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          LOG.info("Table State: " + state);<a name="line.671"></a>
-<span class="sourceLineNo">672</span>        } else {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>          RegionLocations locations = getRegionLocations(r);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>          if (locations == null) return true;<a name="line.674"></a>
-<span class="sourceLineNo">675</span>          for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.675"></a>
-<span class="sourceLineNo">676</span>            if (loc != null) {<a name="line.676"></a>
-<span class="sourceLineNo">677</span>              LOG.info("fullScanMetaAndPrint.HRI Print= " + loc.getRegion());<a name="line.677"></a>
-<span class="sourceLineNo">678</span>            }<a name="line.678"></a>
-<span class="sourceLineNo">679</span>          }<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        }<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        return true;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      }<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    };<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    scanMeta(connection, null, null, QueryType.ALL, v);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  }<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>  public static void scanMetaForTableRegions(Connection connection, Visitor visitor,<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      TableName tableName) throws IOException {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    scanMeta(connection, tableName, QueryType.REGION, Integer.MAX_VALUE, visitor);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>  }<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>  public static void scanMeta(Connection connection, TableName table, QueryType type, int maxRows,<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      final Visitor visitor) throws IOException {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    scanMeta(connection, getTableStartRowForMeta(table, type), getTableStopRowForMeta(table, type),<a name="line.694"></a>
-<span class="sourceLineNo">695</s

<TRUNCATED>

[05/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      if (this.testScanner != 

<TRUNCATED>

[28/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"

<TRUNCATED>

[19/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>     

<TRUNCATED>

[03/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span class="

<TRUNCATED>

[06/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      if (this.testScanne

<TRUNCATED>

[15/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>     

<TRUNCATED>

[39/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html
index cdd2f36..fea2b5a 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html
@@ -151,2029 +151,2019 @@
 <span class="sourceLineNo">143</span>  private static final Logger LOG = LoggerFactory.getLogger(MetaTableAccessor.class);<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  private static final Logger METALOG = LoggerFactory.getLogger("org.apache.hadoop.hbase.META");<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final byte[] META_REGION_PREFIX;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  static {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    // Copy the prefix from FIRST_META_REGIONINFO into META_REGION_PREFIX.<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    // FIRST_META_REGIONINFO == 'hbase:meta,,1'.  META_REGION_PREFIX == 'hbase:meta,'<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    int len = RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName().length - 2;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    META_REGION_PREFIX = new byte [len];<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    System.arraycopy(RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName(), 0,<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      META_REGION_PREFIX, 0, len);<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>  @VisibleForTesting<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  public static final byte[] REPLICATION_PARENT_QUALIFIER = Bytes.toBytes("parent");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private static final byte ESCAPE_BYTE = (byte) 0xFF;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  private static final byte SEPARATED_BYTE = 0x00;<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>  /**<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * Lists all of the table regions currently in META.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   * Deprecated, keep there until some test use this.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @param connection what we will use<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * @param tableName table to list<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * @return Map of all user-space regions to servers<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   * @deprecated use {@link #getTableRegionsAndLocations}, region can have multiple locations<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  @Deprecated<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  public static NavigableMap&lt;RegionInfo, ServerName&gt; allTableRegions(<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      Connection connection, final TableName tableName) throws IOException {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    final NavigableMap&lt;RegionInfo, ServerName&gt; regions = new TreeMap&lt;&gt;();<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    Visitor visitor = new TableVisitorBase(tableName) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      @Override<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      public boolean visitInternal(Result result) throws IOException {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>        RegionLocations locations = getRegionLocations(result);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        if (locations == null) return true;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>          if (loc != null) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>            RegionInfo regionInfo = loc.getRegionInfo();<a name="line.182"></a>
-<span class="sourceLineNo">183</span>            regions.put(regionInfo, loc.getServerName());<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>        return true;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    };<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    scanMetaForTableRegions(connection, visitor, tableName);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    return regions;<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>  @InterfaceAudience.Private<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public enum QueryType {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    ALL(HConstants.TABLE_FAMILY, HConstants.CATALOG_FAMILY),<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    REGION(HConstants.CATALOG_FAMILY),<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    TABLE(HConstants.TABLE_FAMILY),<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    REPLICATION(HConstants.REPLICATION_BARRIER_FAMILY);<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>    private final byte[][] families;<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>    QueryType(byte[]... families) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      this.families = families;<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>    byte[][] getFamilies() {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      return this.families;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  }<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span>  /** The delimiter for meta columns for replicaIds &amp;gt; 0 */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  protected static final char META_REPLICA_ID_DELIMITER = '_';<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>  /** A regex for parsing server columns from meta. See above javadoc for meta layout */<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  private static final Pattern SERVER_COLUMN_PATTERN<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    = Pattern.compile("^server(_[0-9a-fA-F]{4})?$");<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>  ////////////////////////<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  // Reading operations //<a name="line.219"></a>
-<span class="sourceLineNo">220</span>  ////////////////////////<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.223"></a>
-<span class="sourceLineNo">224</span>   * @param connection connection we're using<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * @param visitor Visitor invoked against each row in regions family.<a name="line.225"></a>
+<span class="sourceLineNo">146</span>  @VisibleForTesting<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  public static final byte[] REPLICATION_PARENT_QUALIFIER = Bytes.toBytes("parent");<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final byte ESCAPE_BYTE = (byte) 0xFF;<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final byte SEPARATED_BYTE = 0x00;<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  /**<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * Lists all of the table regions currently in META.<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * Deprecated, keep there until some test use this.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   * @param connection what we will use<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   * @param tableName table to list<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   * @return Map of all user-space regions to servers<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   * @deprecated use {@link #getTableRegionsAndLocations}, region can have multiple locations<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   */<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  @Deprecated<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  public static NavigableMap&lt;RegionInfo, ServerName&gt; allTableRegions(<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      Connection connection, final TableName tableName) throws IOException {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    final NavigableMap&lt;RegionInfo, ServerName&gt; regions = new TreeMap&lt;&gt;();<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    Visitor visitor = new TableVisitorBase(tableName) {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      @Override<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      public boolean visitInternal(Result result) throws IOException {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        RegionLocations locations = getRegionLocations(result);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        if (locations == null) return true;<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>          if (loc != null) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>            RegionInfo regionInfo = loc.getRegionInfo();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>            regions.put(regionInfo, loc.getServerName());<a name="line.173"></a>
+<span class="sourceLineNo">174</span>          }<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>        return true;<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      }<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    };<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    scanMetaForTableRegions(connection, visitor, tableName);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    return regions;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>  @InterfaceAudience.Private<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  public enum QueryType {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    ALL(HConstants.TABLE_FAMILY, HConstants.CATALOG_FAMILY),<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    REGION(HConstants.CATALOG_FAMILY),<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    TABLE(HConstants.TABLE_FAMILY),<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    REPLICATION(HConstants.REPLICATION_BARRIER_FAMILY);<a name="line.188"></a>
+<span class="sourceLineNo">189</span><a name="line.189"></a>
+<span class="sourceLineNo">190</span>    private final byte[][] families;<a name="line.190"></a>
+<span class="sourceLineNo">191</span><a name="line.191"></a>
+<span class="sourceLineNo">192</span>    QueryType(byte[]... families) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      this.families = families;<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>    byte[][] getFamilies() {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      return this.families;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  }<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>  /** The delimiter for meta columns for replicaIds &amp;gt; 0 */<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  protected static final char META_REPLICA_ID_DELIMITER = '_';<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>  /** A regex for parsing server columns from meta. See above javadoc for meta layout */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  private static final Pattern SERVER_COLUMN_PATTERN<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    = Pattern.compile("^server(_[0-9a-fA-F]{4})?$");<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>  ////////////////////////<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  // Reading operations //<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  ////////////////////////<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>  /**<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * @param connection connection we're using<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * @param visitor Visitor invoked against each row in regions family.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   */<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  public static void fullScanRegions(Connection connection,<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      final Visitor visitor)<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      throws IOException {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    scanMeta(connection, null, null, QueryType.REGION, visitor);<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>  /**<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   * @param connection connection we're using<a name="line.225"></a>
 <span class="sourceLineNo">226</span>   */<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  public static void fullScanRegions(Connection connection,<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      final Visitor visitor)<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      throws IOException {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    scanMeta(connection, null, null, QueryType.REGION, visitor);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   * @param connection connection we're using<a name="line.235"></a>
+<span class="sourceLineNo">227</span>  public static List&lt;Result&gt; fullScanRegions(Connection connection)<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      throws IOException {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    return fullScan(connection, QueryType.REGION);<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>  /**<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for tables.<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * @param connection connection we're using<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * @param visitor Visitor invoked against each row in tables family.<a name="line.235"></a>
 <span class="sourceLineNo">236</span>   */<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  public static List&lt;Result&gt; fullScanRegions(Connection connection)<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      throws IOException {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    return fullScan(connection, QueryType.REGION);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for tables.<a name="line.243"></a>
-<span class="sourceLineNo">244</span>   * @param connection connection we're using<a name="line.244"></a>
-<span class="sourceLineNo">245</span>   * @param visitor Visitor invoked against each row in tables family.<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   */<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  public static void fullScanTables(Connection connection,<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      final Visitor visitor)<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      throws IOException {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    scanMeta(connection, null, null, QueryType.TABLE, visitor);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt;.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * @param connection connection we're using<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   * @param type scanned part of meta<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * @return List of {@link Result}<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  public static List&lt;Result&gt; fullScan(Connection connection, QueryType type)<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    throws IOException {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    CollectAllVisitor v = new CollectAllVisitor();<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    scanMeta(connection, null, null, type, v);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    return v.getResults();<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>  /**<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * Callers should call close on the returned {@link Table} instance.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * @param connection connection we're using to access Meta<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   * @return An {@link Table} for &lt;code&gt;hbase:meta&lt;/code&gt;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  public static Table getMetaHTable(final Connection connection)<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  throws IOException {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    // We used to pass whole CatalogTracker in here, now we just pass in Connection<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    if (connection == null) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      throw new NullPointerException("No connection");<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    } else if (connection.isClosed()) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      throw new IOException("connection is closed");<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    return connection.getTable(TableName.META_TABLE_NAME);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * @param t Table to use (will be closed when done).<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * @param g Get to run<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   */<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  private static Result get(final Table t, final Get g) throws IOException {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    if (t == null) return null;<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    try {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      return t.get(g);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    } finally {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      t.close();<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  /**<a name="line.295"></a>
-<span class="sourceLineNo">296</span>   * Gets the region info and assignment for the specified region.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   * @param connection connection we're using<a name="line.297"></a>
-<span class="sourceLineNo">298</span>   * @param regionName Region to lookup.<a name="line.298"></a>
-<span class="sourceLineNo">299</span>   * @return Location and RegionInfo for &lt;code&gt;regionName&lt;/code&gt;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * @deprecated use {@link #getRegionLocation(Connection, byte[])} instead<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  @Deprecated<a name="line.302"></a>
-<span class="sourceLineNo">303</span>  public static Pair&lt;RegionInfo, ServerName&gt; getRegion(Connection connection, byte [] regionName)<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    throws IOException {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    HRegionLocation location = getRegionLocation(connection, regionName);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    return location == null<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      ? null<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      : new Pair&lt;&gt;(location.getRegionInfo(), location.getServerName());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  /**<a name="line.311"></a>
-<span class="sourceLineNo">312</span>   * Returns the HRegionLocation from meta for the given region<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * @param connection connection we're using<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   * @param regionName region we're looking for<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   * @return HRegionLocation for the given region<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   */<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  public static HRegionLocation getRegionLocation(Connection connection, byte[] regionName)<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      throws IOException {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    byte[] row = regionName;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    RegionInfo parsedInfo = null;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    try {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      parsedInfo = parseRegionInfoFromRegionName(regionName);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      row = getMetaKeyForRegion(parsedInfo);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    } catch (Exception parseEx) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      // Ignore. This is used with tableName passed as regionName.<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    Get get = new Get(row);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    Result r = get(getMetaHTable(connection), get);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    RegionLocations locations = getRegionLocations(r);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    return locations == null ? null<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      : locations.getRegionLocation(parsedInfo == null ? 0 : parsedInfo.getReplicaId());<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  }<a name="line.333"></a>
-<span class="sourceLineNo">334</span><a name="line.334"></a>
-<span class="sourceLineNo">335</span>  /**<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   * Returns the HRegionLocation from meta for the given region<a name="line.336"></a>
-<span class="sourceLineNo">337</span>   * @param connection connection we're using<a name="line.337"></a>
-<span class="sourceLineNo">338</span>   * @param regionInfo region information<a name="line.338"></a>
-<span class="sourceLineNo">339</span>   * @return HRegionLocation for the given region<a name="line.339"></a>
-<span class="sourceLineNo">340</span>   */<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  public static HRegionLocation getRegionLocation(Connection connection, RegionInfo regionInfo)<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throws IOException {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    byte[] row = getMetaKeyForRegion(regionInfo);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    Get get = new Get(row);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    Result r = get(getMetaHTable(connection), get);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    return getRegionLocation(r, regionInfo, regionInfo.getReplicaId());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  }<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  /** Returns the row key to use for this regionInfo */<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  public static byte[] getMetaKeyForRegion(RegionInfo regionInfo) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    return RegionReplicaUtil.getRegionInfoForDefaultReplica(regionInfo).getRegionName();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  }<a name="line.353"></a>
-<span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>  /** Returns an HRI parsed from this regionName. Not all the fields of the HRI<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * is stored in the name, so the returned object should only be used for the fields<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   * in the regionName.<a name="line.357"></a>
-<span class="sourceLineNo">358</span>   */<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  public static RegionInfo parseRegionInfoFromRegionName(byte[] regionName) throws IOException {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    byte[][] fields = RegionInfo.parseRegionName(regionName);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    long regionId = Long.parseLong(Bytes.toString(fields[2]));<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    int replicaId = fields.length &gt; 3 ? Integer.parseInt(Bytes.toString(fields[3]), 16) : 0;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    return RegionInfoBuilder.newBuilder(TableName.valueOf(fields[0]))<a name="line.363"></a>
-<span class="sourceLineNo">364</span>              .setStartKey(fields[1])<a name="line.364"></a>
-<span class="sourceLineNo">365</span>              .setEndKey(fields[2])<a name="line.365"></a>
-<span class="sourceLineNo">366</span>              .setSplit(false)<a name="line.366"></a>
-<span class="sourceLineNo">367</span>              .setRegionId(regionId)<a name="line.367"></a>
-<span class="sourceLineNo">368</span>              .setReplicaId(replicaId)<a name="line.368"></a>
-<span class="sourceLineNo">369</span>              .build();<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>  /**<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * Gets the result in hbase:meta for the specified region.<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * @param connection connection we're using<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * @param regionName region we're looking for<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * @return result of the specified region<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   */<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public static Result getRegionResult(Connection connection,<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      byte[] regionName) throws IOException {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    Get get = new Get(regionName);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    return get(getMetaHTable(connection), get);<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>   * Get regions from the merge qualifier of the specified merged region<a name="line.386"></a>
-<span class="sourceLineNo">387</span>   * @return null if it doesn't contain merge qualifier, else two merge regions<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   */<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  @Nullable<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  public static Pair&lt;RegionInfo, RegionInfo&gt; getRegionsFromMergeQualifier(<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      Connection connection, byte[] regionName) throws IOException {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Result result = getRegionResult(connection, regionName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    RegionInfo mergeA = getRegionInfo(result, HConstants.MERGEA_QUALIFIER);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    RegionInfo mergeB = getRegionInfo(result, HConstants.MERGEB_QUALIFIER);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    if (mergeA == null &amp;&amp; mergeB == null) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      return null;<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    }<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    return new Pair&lt;&gt;(mergeA, mergeB);<a name="line.398"></a>
-<span class="sourceLineNo">399</span> }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>  /**<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * Checks if the specified table exists.  Looks at the hbase:meta table hosted on<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   * the specified server.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>   * @param connection connection we're using<a name="line.404"></a>
-<span class="sourceLineNo">405</span>   * @param tableName table to check<a name="line.405"></a>
-<span class="sourceLineNo">406</span>   * @return true if the table exists in meta, false if not<a name="line.406"></a>
-<span class="sourceLineNo">407</span>   */<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public static boolean tableExists(Connection connection,<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      final TableName tableName)<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  throws IOException {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // Catalog tables always exist.<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return tableName.equals(TableName.META_TABLE_NAME)<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        || getTableState(connection, tableName) != null;<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>   * Lists all of the regions currently in META.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   *<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   * @param connection to connect with<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   * @param excludeOfflinedSplitParents False if we are to include offlined/splitparents regions,<a name="line.420"></a>
-<span class="sourceLineNo">421</span>   *                                    true and we'll leave out offlined regions from returned list<a name="line.421"></a>
-<span class="sourceLineNo">422</span>   * @return List of all user-space regions.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   */<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  @VisibleForTesting<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  public static List&lt;RegionInfo&gt; getAllRegions(Connection connection,<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      boolean excludeOfflinedSplitParents)<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      throws IOException {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result;<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>    result = getTableRegionsAndLocations(connection, null,<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        excludeOfflinedSplitParents);<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>    return getListOfRegionInfos(result);<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  /**<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * @param connection connection we're using<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * @param tableName table we're looking for<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   */<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName)<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  throws IOException {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return getTableRegions(connection, tableName, false);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  /**<a name="line.449"></a>
-<span class="sourceLineNo">450</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.450"></a>
-<span class="sourceLineNo">451</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * @param connection connection we're using<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   * @param tableName table we're looking for<a name="line.453"></a>
-<span class="sourceLineNo">454</span>   * @param excludeOfflinedSplitParents If true, do not include offlined split<a name="line.454"></a>
-<span class="sourceLineNo">455</span>   * parents in the return.<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   */<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName,<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result =<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      getTableRegionsAndLocations(connection, tableName, excludeOfflinedSplitParents);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    return getListOfRegionInfos(result);<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>  private static List&lt;RegionInfo&gt; getListOfRegionInfos(<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      final List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    if (pairs == null || pairs.isEmpty()) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      return Collections.emptyList();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    List&lt;RegionInfo&gt; result = new ArrayList&lt;&gt;(pairs.size());<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      result.add(pair.getFirst());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    return result;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  }<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>  /**<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * @param tableName table we're working with<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * @return start row for scanning META according to query type<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   */<a name="line.480"></a>
-<span class="sourceLineNo">481</span>  public static byte[] getTableStartRowForMeta(TableName tableName, QueryType type) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    if (tableName == null) {<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      return null;<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    switch (type) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    case REGION:<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      byte[] startRow = new byte[tableName.getName().length + 2];<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      System.arraycopy(tableName.getName(), 0, startRow, 0, tableName.getName().length);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      startRow[startRow.length - 2] = HConstants.DELIMITER;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      startRow[startRow.length - 1] = HConstants.DELIMITER;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      return startRow;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    case ALL:<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    case TABLE:<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    default:<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      return tableName.getName();<a name="line.495"></a>
+<span class="sourceLineNo">237</span>  public static void fullScanTables(Connection connection,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      final Visitor visitor)<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      throws IOException {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    scanMeta(connection, null, null, QueryType.TABLE, visitor);<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>  /**<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt;.<a name="line.244"></a>
+<span class="sourceLineNo">245</span>   * @param connection connection we're using<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   * @param type scanned part of meta<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * @return List of {@link Result}<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   */<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  public static List&lt;Result&gt; fullScan(Connection connection, QueryType type)<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    throws IOException {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    CollectAllVisitor v = new CollectAllVisitor();<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    scanMeta(connection, null, null, type, v);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    return v.getResults();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  /**<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * Callers should call close on the returned {@link Table} instance.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * @param connection connection we're using to access Meta<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * @return An {@link Table} for &lt;code&gt;hbase:meta&lt;/code&gt;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  public static Table getMetaHTable(final Connection connection)<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  throws IOException {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    // We used to pass whole CatalogTracker in here, now we just pass in Connection<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    if (connection == null) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      throw new NullPointerException("No connection");<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    } else if (connection.isClosed()) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      throw new IOException("connection is closed");<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    return connection.getTable(TableName.META_TABLE_NAME);<a name="line.269"></a>
+<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  /**<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * @param t Table to use (will be closed when done).<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   * @param g Get to run<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  private static Result get(final Table t, final Get g) throws IOException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    if (t == null) return null;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    try {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      return t.get(g);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    } finally {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      t.close();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  }<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * Gets the region info and assignment for the specified region.<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * @param connection connection we're using<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * @param regionName Region to lookup.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * @return Location and RegionInfo for &lt;code&gt;regionName&lt;/code&gt;<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * @deprecated use {@link #getRegionLocation(Connection, byte[])} instead<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   */<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  @Deprecated<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  public static Pair&lt;RegionInfo, ServerName&gt; getRegion(Connection connection, byte [] regionName)<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    throws IOException {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    HRegionLocation location = getRegionLocation(connection, regionName);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    return location == null<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      ? null<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      : new Pair&lt;&gt;(location.getRegionInfo(), location.getServerName());<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>  /**<a name="line.301"></a>
+<span class="sourceLineNo">302</span>   * Returns the HRegionLocation from meta for the given region<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * @param connection connection we're using<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * @param regionName region we're looking for<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * @return HRegionLocation for the given region<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   */<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  public static HRegionLocation getRegionLocation(Connection connection, byte[] regionName)<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      throws IOException {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    byte[] row = regionName;<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    RegionInfo parsedInfo = null;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    try {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      parsedInfo = parseRegionInfoFromRegionName(regionName);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      row = getMetaKeyForRegion(parsedInfo);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    } catch (Exception parseEx) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      // Ignore. This is used with tableName passed as regionName.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    Get get = new Get(row);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    Result r = get(getMetaHTable(connection), get);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    RegionLocations locations = getRegionLocations(r);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return locations == null ? null<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      : locations.getRegionLocation(parsedInfo == null ? 0 : parsedInfo.getReplicaId());<a name="line.322"></a>
+<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
+<span class="sourceLineNo">324</span><a name="line.324"></a>
+<span class="sourceLineNo">325</span>  /**<a name="line.325"></a>
+<span class="sourceLineNo">326</span>   * Returns the HRegionLocation from meta for the given region<a name="line.326"></a>
+<span class="sourceLineNo">327</span>   * @param connection connection we're using<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   * @param regionInfo region information<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   * @return HRegionLocation for the given region<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   */<a name="line.330"></a>
+<span class="sourceLineNo">331</span>  public static HRegionLocation getRegionLocation(Connection connection, RegionInfo regionInfo)<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      throws IOException {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    byte[] row = getMetaKeyForRegion(regionInfo);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    Get get = new Get(row);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    Result r = get(getMetaHTable(connection), get);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    return getRegionLocation(r, regionInfo, regionInfo.getReplicaId());<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  }<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  /** Returns the row key to use for this regionInfo */<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  public static byte[] getMetaKeyForRegion(RegionInfo regionInfo) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    return RegionReplicaUtil.getRegionInfoForDefaultReplica(regionInfo).getRegionName();<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  /** Returns an HRI parsed from this regionName. Not all the fields of the HRI<a name="line.345"></a>
+<span class="sourceLineNo">346</span>   * is stored in the name, so the returned object should only be used for the fields<a name="line.346"></a>
+<span class="sourceLineNo">347</span>   * in the regionName.<a name="line.347"></a>
+<span class="sourceLineNo">348</span>   */<a name="line.348"></a>
+<span class="sourceLineNo">349</span>  public static RegionInfo parseRegionInfoFromRegionName(byte[] regionName) throws IOException {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    byte[][] fields = RegionInfo.parseRegionName(regionName);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    long regionId = Long.parseLong(Bytes.toString(fields[2]));<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    int replicaId = fields.length &gt; 3 ? Integer.parseInt(Bytes.toString(fields[3]), 16) : 0;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    return RegionInfoBuilder.newBuilder(TableName.valueOf(fields[0]))<a name="line.353"></a>
+<span class="sourceLineNo">354</span>              .setStartKey(fields[1])<a name="line.354"></a>
+<span class="sourceLineNo">355</span>              .setEndKey(fields[2])<a name="line.355"></a>
+<span class="sourceLineNo">356</span>              .setSplit(false)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>              .setRegionId(regionId)<a name="line.357"></a>
+<span class="sourceLineNo">358</span>              .setReplicaId(replicaId)<a name="line.358"></a>
+<span class="sourceLineNo">359</span>              .build();<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  }<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * Gets the result in hbase:meta for the specified region.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   * @param connection connection we're using<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   * @param regionName region we're looking for<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   * @return result of the specified region<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
+<span class="sourceLineNo">368</span>  public static Result getRegionResult(Connection connection,<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      byte[] regionName) throws IOException {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    Get get = new Get(regionName);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    return get(getMetaHTable(connection), get);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>  }<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>   * Get regions from the merge qualifier of the specified merged region<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * @return null if it doesn't contain merge qualifier, else two merge regions<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   */<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  @Nullable<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  public static Pair&lt;RegionInfo, RegionInfo&gt; getRegionsFromMergeQualifier(<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      Connection connection, byte[] regionName) throws IOException {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    Result result = getRegionResult(connection, regionName);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    RegionInfo mergeA = getRegionInfo(result, HConstants.MERGEA_QUALIFIER);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    RegionInfo mergeB = getRegionInfo(result, HConstants.MERGEB_QUALIFIER);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (mergeA == null &amp;&amp; mergeB == null) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return null;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    return new Pair&lt;&gt;(mergeA, mergeB);<a name="line.388"></a>
+<span class="sourceLineNo">389</span> }<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>   * Checks if the specified table exists.  Looks at the hbase:meta table hosted on<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * the specified server.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * @param connection connection we're using<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @param tableName table to check<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   * @return true if the table exists in meta, false if not<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   */<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  public static boolean tableExists(Connection connection,<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      final TableName tableName)<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  throws IOException {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // Catalog tables always exist.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    return tableName.equals(TableName.META_TABLE_NAME)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || getTableState(connection, tableName) != null;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  /**<a name="line.406"></a>
+<span class="sourceLineNo">407</span>   * Lists all of the regions currently in META.<a name="line.407"></a>
+<span class="sourceLineNo">408</span>   *<a name="line.408"></a>
+<span class="sourceLineNo">409</span>   * @param connection to connect with<a name="line.409"></a>
+<span class="sourceLineNo">410</span>   * @param excludeOfflinedSplitParents False if we are to include offlined/splitparents regions,<a name="line.410"></a>
+<span class="sourceLineNo">411</span>   *                                    true and we'll leave out offlined regions from returned list<a name="line.411"></a>
+<span class="sourceLineNo">412</span>   * @return List of all user-space regions.<a name="line.412"></a>
+<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
+<span class="sourceLineNo">414</span>  @VisibleForTesting<a name="line.414"></a>
+<span class="sourceLineNo">415</span>  public static List&lt;RegionInfo&gt; getAllRegions(Connection connection,<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      boolean excludeOfflinedSplitParents)<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      throws IOException {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result;<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    result = getTableRegionsAndLocations(connection, null,<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        excludeOfflinedSplitParents);<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>    return getListOfRegionInfos(result);<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>  }<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>  /**<a name="line.427"></a>
+<span class="sourceLineNo">428</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.428"></a>
+<span class="sourceLineNo">429</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.429"></a>
+<span class="sourceLineNo">430</span>   * @param connection connection we're using<a name="line.430"></a>
+<span class="sourceLineNo">431</span>   * @param tableName table we're looking for<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName)<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  throws IOException {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    return getTableRegions(connection, tableName, false);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  }<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>   * Gets all of the regions of the specified table. Do not use this method<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   * @param connection connection we're using<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @param tableName table we're looking for<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   * @param excludeOfflinedSplitParents If true, do not include offlined split<a name="line.444"></a>
+<span class="sourceLineNo">445</span>   * parents in the return.<a name="line.445"></a>
+<span class="sourceLineNo">446</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>   */<a name="line.447"></a>
+<span class="sourceLineNo">448</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName,<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result =<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      getTableRegionsAndLocations(connection, tableName, excludeOfflinedSplitParents);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    return getListOfRegionInfos(result);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  private static List&lt;RegionInfo&gt; getListOfRegionInfos(<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      final List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs) {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    if (pairs == null || pairs.isEmpty()) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      return Collections.emptyList();<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    List&lt;RegionInfo&gt; result = new ArrayList&lt;&gt;(pairs.size());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      result.add(pair.getFirst());<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    return result;<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>  /**<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * @param tableName table we're working with<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * @return start row for scanning META according to query type<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   */<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  public static byte[] getTableStartRowForMeta(TableName tableName, QueryType type) {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    if (tableName == null) {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      return null;<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    switch (type) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    case REGION:<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      byte[] startRow = new byte[tableName.getName().length + 2];<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      System.arraycopy(tableName.getName(), 0, startRow, 0, tableName.getName().length);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      startRow[startRow.length - 2] = HConstants.DELIMITER;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      startRow[startRow.length - 1] = HConstants.DELIMITER;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      return startRow;<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    case ALL:<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    case TABLE:<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    default:<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      return tableName.getName();<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    }<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>  /**<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * @param tableName table we're working with<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   * @return stop row for scanning META according to query type<a name="line.491"></a>
+<span class="sourceLineNo">492</span>   */<a name="line.492"></a>
+<span class="sourceLineNo">493</span>  public static byte[] getTableStopRowForMeta(TableName tableName, QueryType type) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    if (tableName == null) {<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return null;<a name="line.495"></a>
 <span class="sourceLineNo">496</span>    }<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>  /**<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   * @param tableName table we're working with<a name="line.500"></a>
-<span class="sourceLineNo">501</span>   * @return stop row for scanning META according to query type<a name="line.501"></a>
-<span class="sourceLineNo">502</span>   */<a name="line.502"></a>
-<span class="sourceLineNo">503</span>  public static byte[] getTableStopRowForMeta(TableName tableName, QueryType type) {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    if (tableName == null) {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      return null;<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    }<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    final byte[] stopRow;<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    switch (type) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    case REGION:<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      stopRow = new byte[tableName.getName().length + 3];<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      System.arraycopy(tableName.getName(), 0, stopRow, 0, tableName.getName().length);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      stopRow[stopRow.length - 3] = ' ';<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      stopRow[stopRow.length - 2] = HConstants.DELIMITER;<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      stopRow[stopRow.length - 1] = HConstants.DELIMITER;<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      break;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    case ALL:<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    case TABLE:<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    default:<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      stopRow = new byte[tableName.getName().length + 1];<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      System.arraycopy(tableName.getName(), 0, stopRow, 0, tableName.getName().length);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      stopRow[stopRow.length - 1] = ' ';<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      break;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    }<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    return stopRow;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * This method creates a Scan object that will only scan catalog rows that<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   * belong to the specified table. It doesn't specify any columns.<a name="line.529"></a>
-<span class="sourceLineNo">530</span>   * This is a better alternative to just using a start row and scan until<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * it hits a new table since that requires parsing the HRI to get the table<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   * name.<a name="line.532"></a>
-<span class="sourceLineNo">533</span>   * @param tableName bytes of table's name<a name="line.533"></a>
-<span class="sourceLineNo">534</span>   * @return configured Scan object<a name="line.534"></a>
-<span class="sourceLineNo">535</span>   */<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  @Deprecated<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  public static Scan getScanForTableName(Connection connection, TableName tableName) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    // Start key is just the table name with delimiters<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    byte[] startKey = getTableStartRowForMeta(tableName, QueryType.REGION);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    // Stop key appends the smallest possible char to the table name<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    byte[] stopKey = getTableStopRowForMeta(tableName, QueryType.REGION);<a name="line.541"></a>
-<span class="sourceLineNo">542</span><a name="line.542"></a>
-<span class="sourceLineNo">543</span>    Scan scan = getMetaScan(connection, -1);<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    scan.setStartRow(startKey);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    scan.setStopRow(stopKey);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    return scan;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>  private static Scan getMetaScan(Connection connection, int rowUpperLimit) {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    Scan scan = new Scan();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    int scannerCaching = connection.getConfiguration()<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        .getInt(HConstants.HBASE_META_SCANNER_CACHING,<a name="line.552"></a>
-<span class="sourceLineNo">553</span>            HConstants.DEFAULT_HBASE_META_SCANNER_CACHING);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    if (connection.getConfiguration().getBoolean(HConstants.USE_META_REPLICAS,<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        HConstants.DEFAULT_USE_META_REPLICAS)) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      scan.setConsistency(Consistency.TIMELINE);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    if (rowUpperLimit &gt; 0) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      scan.setLimit(rowUpperLimit);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      scan.setReadType(Scan.ReadType.PREAD);<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    scan.setCaching(scannerCaching);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    return scan;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  /**<a name="line.565"></a>
-<span class="sourceLineNo">566</span>   * Do not use this method to get meta table regions, use methods in MetaTableLocator instead.<a name="line.566"></a>
-<span class="sourceLineNo">567</span>   * @param connection connection we're using<a name="line.567"></a>
-<span class="sourceLineNo">568</span>   * @param tableName table we're looking for<a name="line.568"></a>
-<span class="sourceLineNo">569</span>   * @return Return list of regioninfos and server.<a name="line.569"></a>
-<span class="sourceLineNo">570</span>   * @throws IOException<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   */<a name="line.571"></a>
-<span class="sourceLineNo">572</span>  public static List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    getTableRegionsAndLocations(Connection connection, TableName tableName)<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      throws IOException {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    return getTableRegionsAndLocations(connection, tableName, true);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>  }<a name="line.576"></a>
-<span class="sourceLineNo">577</span><a name="line.577"></a>
-<span class="sourceLineNo">578</span>  /**<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   * Do not use this method to get meta table regions, use methods in MetaTableLocator instead.<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param connection connection we're using<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param tableName table to work with, can be null for getting all regions<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @param excludeOfflinedSplitParents don't return split parents<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   * @return Return list of regioninfos and server addresses.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   * @throws IOException<a name="line.584"></a>
-<span class="sourceLineNo">585</span>   */<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  public static List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; getTableRegionsAndLocations(<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      Connection connection, @Nullable final TableName tableName,<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    if (tableName != null &amp;&amp; tableName.equals(TableName.META_TABLE_NAME)) {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      throw new IOException("This method can't be used to locate meta regions;"<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        + " use MetaTableLocator instead");<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    }<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    // Make a version of CollectingVisitor that collects RegionInfo and ServerAddress<a name="line.593"></a>
-<span class="sourceLineNo">594</span>    CollectingVisitor&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; visitor =<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      new CollectingVisitor&lt;Pair&lt;RegionInfo, ServerName&gt;&gt;() {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>        private RegionLocations current = null;<a name="line.596"></a>
-<span class="sourceLineNo">597</span><a name="line.597"></a>
-<span class="sourceLineNo">598</span>        @Override<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        public boolean visit(Result r) throws IOException {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>          current = getRegionLocations(r);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          if (current == null || current.getRegionLocation().getRegion() == null) {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>            LOG.warn("No serialized RegionInfo in " + r);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>            return true;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>          }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          RegionInfo hri = current.getRegionLocation().getRegion();<a name="line.605"></a>
-<span class="sourceLineNo">606</span>          if (excludeOfflinedSplitParents &amp;&amp; hri.isSplitParent()) return true;<a name="line.606"></a>
-<span class="sourceLineNo">607</span>          // Else call super and add this Result to the collection.<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          return super.visit(r);<a name="line.608"></a>
-<span class="sourceLineNo">609</span>        }<a name="line.609"></a>
-<span class="sourceLineNo">610</span><a name="line.610"></a>
-<span class="sourceLineNo">611</span>        @Override<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        void add(Result r) {<a name="line.612"></a>
-<span class="sourceLineNo">613</span>          if (current == null) {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>            return;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>          }<a name="line.615"></a>
-<span class="sourceLineNo">616</span>          for (HRegionLocation loc : current.getRegionLocations()) {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>            if (loc != null) {<a name="line.617"></a>
-<span class="sourceLineNo">618</span>              this.results.add(new Pair&lt;&gt;(loc.getRegion(), loc.getServerName()));<a name="line.618"></a>
-<span class="sourceLineNo">619</span>            }<a name="line.619"></a>
-<span class="sourceLineNo">620</span>          }<a name="line.620"></a>
-<span class="sourceLineNo">621</span>        }<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      };<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    scanMeta(connection,<a name="line.623"></a>
-<span class="sourceLineNo">624</span>        getTableStartRowForMeta(tableName, QueryType.REGION),<a name="line.624"></a>
-<span class="sourceLineNo">625</span>        getTableStopRowForMeta(tableName, QueryType.REGION),<a name="line.625"></a>
-<span class="sourceLineNo">626</span>        QueryType.REGION, visitor);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    return visitor.getResults();<a name="line.627"></a>
-<span class="sourceLineNo">628</span>  }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>  /**<a name="line.630"></a>
-<span class="sourceLineNo">631</span>   * @param connection connection we're using<a name="line.631"></a>
-<span class="sourceLineNo">632</span>   * @param serverName server whose regions we're interested in<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * @return List of user regions installed on this server (does not include<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * catalog regions).<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   * @throws IOException<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   */<a name="line.636"></a>
-<span class="sourceLineNo">637</span>  public static NavigableMap&lt;RegionInfo, Result&gt;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>  getServerUserRegions(Connection connection, final ServerName serverName)<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    throws IOException {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    final NavigableMap&lt;RegionInfo, Result&gt; hris = new TreeMap&lt;&gt;();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    // Fill the above hris map with entries from hbase:meta that have the passed<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    // servername.<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    CollectingVisitor&lt;Result&gt; v = new CollectingVisitor&lt;Result&gt;() {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      @Override<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      void add(Result r) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        if (r == null || r.isEmpty()) return;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        RegionLocations locations = getRegionLocations(r);<a name="line.647"></a>
-<span class="sourceLineNo">648</span>        if (locations == null) return;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>          if (loc != null) {<a name="line.650"></a>
-<span class="sourceLineNo">651</span>            if (loc.getServerName() != null &amp;&amp; loc.getServerName().equals(serverName)) {<a name="line.651"></a>
-<span class="sourceLineNo">652</span>              hris.put(loc.getRegion(), r);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>            }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>          }<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    };<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    scanMeta(connection, null, null, QueryType.REGION, v);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    return hris;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>  }<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  public static void fullScanMetaAndPrint(Connection connection)<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    throws IOException {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    Visitor v = new Visitor() {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      @Override<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      public boolean visit(Result r) throws IOException {<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        if (r ==  null || r.isEmpty()) return true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        LOG.info("fullScanMetaAndPrint.Current Meta Row: " + r);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        TableState state = getTableState(r);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (state != null) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          LOG.info("Table State: " + state);<a name="line.671"></a>
-<span class="sourceLineNo">672</span>        } else {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>          RegionLocations locations = getRegionLocations(r);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>          if (locations == null) return true;<a name="line.674"></a>
-<span class="sourceLineNo">675</span>          for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.675"></a>
-<span class="sourceLineNo">676</span>            if (loc != null) {<a name="line.676"></a>
-<span class="sourceLineNo">677</span>              LOG.info("fullScanMetaAndPrint.HRI Print= " + loc.getRegion());<a name="line.677"></a>
-<span class="sourceLineNo">678</span>            }<a name="line.678"></a>
-<span class="sourceLineNo">679</span>          }<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        }<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        return true;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      }<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    };<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    scanMeta(connection, null, null, QueryType.ALL, v);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  }<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>  public static void scanMetaForTableRegions(Connection connection, Visitor visitor,<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      TableName tableName) throws IOException {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    scanMeta(connection, tableName, QueryType.REGION, Integer.MAX_VALUE, visitor);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>  }<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>  public static void scanMeta(Connection connection, TableName table, QueryType type, int maxRows,<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      final Visitor visitor) throws IOException {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    scanMeta(connection, getTableStartRowForMeta(table, type), getTableStopRowForMeta(table, type),<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      type, maxRows, visitor);<a name="line.695"></

<TRUNCATED>

[02/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      if (this.testScanner != null) {<a 

<TRUNCATED>

[41/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html b/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html
index cdd2f36..fea2b5a 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html
@@ -151,2029 +151,2019 @@
 <span class="sourceLineNo">143</span>  private static final Logger LOG = LoggerFactory.getLogger(MetaTableAccessor.class);<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  private static final Logger METALOG = LoggerFactory.getLogger("org.apache.hadoop.hbase.META");<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final byte[] META_REGION_PREFIX;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  static {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    // Copy the prefix from FIRST_META_REGIONINFO into META_REGION_PREFIX.<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    // FIRST_META_REGIONINFO == 'hbase:meta,,1'.  META_REGION_PREFIX == 'hbase:meta,'<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    int len = RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName().length - 2;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    META_REGION_PREFIX = new byte [len];<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    System.arraycopy(RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName(), 0,<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      META_REGION_PREFIX, 0, len);<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>  @VisibleForTesting<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  public static final byte[] REPLICATION_PARENT_QUALIFIER = Bytes.toBytes("parent");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private static final byte ESCAPE_BYTE = (byte) 0xFF;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  private static final byte SEPARATED_BYTE = 0x00;<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>  /**<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * Lists all of the table regions currently in META.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   * Deprecated, keep there until some test use this.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @param connection what we will use<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * @param tableName table to list<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * @return Map of all user-space regions to servers<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   * @deprecated use {@link #getTableRegionsAndLocations}, region can have multiple locations<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  @Deprecated<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  public static NavigableMap&lt;RegionInfo, ServerName&gt; allTableRegions(<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      Connection connection, final TableName tableName) throws IOException {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    final NavigableMap&lt;RegionInfo, ServerName&gt; regions = new TreeMap&lt;&gt;();<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    Visitor visitor = new TableVisitorBase(tableName) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      @Override<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      public boolean visitInternal(Result result) throws IOException {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>        RegionLocations locations = getRegionLocations(result);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        if (locations == null) return true;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>          if (loc != null) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>            RegionInfo regionInfo = loc.getRegionInfo();<a name="line.182"></a>
-<span class="sourceLineNo">183</span>            regions.put(regionInfo, loc.getServerName());<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>        return true;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    };<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    scanMetaForTableRegions(connection, visitor, tableName);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    return regions;<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>  @InterfaceAudience.Private<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public enum QueryType {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    ALL(HConstants.TABLE_FAMILY, HConstants.CATALOG_FAMILY),<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    REGION(HConstants.CATALOG_FAMILY),<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    TABLE(HConstants.TABLE_FAMILY),<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    REPLICATION(HConstants.REPLICATION_BARRIER_FAMILY);<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>    private final byte[][] families;<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>    QueryType(byte[]... families) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      this.families = families;<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>    byte[][] getFamilies() {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      return this.families;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  }<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span>  /** The delimiter for meta columns for replicaIds &amp;gt; 0 */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  protected static final char META_REPLICA_ID_DELIMITER = '_';<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>  /** A regex for parsing server columns from meta. See above javadoc for meta layout */<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  private static final Pattern SERVER_COLUMN_PATTERN<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    = Pattern.compile("^server(_[0-9a-fA-F]{4})?$");<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>  ////////////////////////<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  // Reading operations //<a name="line.219"></a>
-<span class="sourceLineNo">220</span>  ////////////////////////<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.223"></a>
-<span class="sourceLineNo">224</span>   * @param connection connection we're using<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * @param visitor Visitor invoked against each row in regions family.<a name="line.225"></a>
+<span class="sourceLineNo">146</span>  @VisibleForTesting<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  public static final byte[] REPLICATION_PARENT_QUALIFIER = Bytes.toBytes("parent");<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final byte ESCAPE_BYTE = (byte) 0xFF;<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final byte SEPARATED_BYTE = 0x00;<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  /**<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * Lists all of the table regions currently in META.<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * Deprecated, keep there until some test use this.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   * @param connection what we will use<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   * @param tableName table to list<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   * @return Map of all user-space regions to servers<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   * @deprecated use {@link #getTableRegionsAndLocations}, region can have multiple locations<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   */<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  @Deprecated<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  public static NavigableMap&lt;RegionInfo, ServerName&gt; allTableRegions(<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      Connection connection, final TableName tableName) throws IOException {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    final NavigableMap&lt;RegionInfo, ServerName&gt; regions = new TreeMap&lt;&gt;();<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    Visitor visitor = new TableVisitorBase(tableName) {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      @Override<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      public boolean visitInternal(Result result) throws IOException {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        RegionLocations locations = getRegionLocations(result);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        if (locations == null) return true;<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>          if (loc != null) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>            RegionInfo regionInfo = loc.getRegionInfo();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>            regions.put(regionInfo, loc.getServerName());<a name="line.173"></a>
+<span class="sourceLineNo">174</span>          }<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>        return true;<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      }<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    };<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    scanMetaForTableRegions(connection, visitor, tableName);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    return regions;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>  @InterfaceAudience.Private<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  public enum QueryType {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    ALL(HConstants.TABLE_FAMILY, HConstants.CATALOG_FAMILY),<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    REGION(HConstants.CATALOG_FAMILY),<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    TABLE(HConstants.TABLE_FAMILY),<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    REPLICATION(HConstants.REPLICATION_BARRIER_FAMILY);<a name="line.188"></a>
+<span class="sourceLineNo">189</span><a name="line.189"></a>
+<span class="sourceLineNo">190</span>    private final byte[][] families;<a name="line.190"></a>
+<span class="sourceLineNo">191</span><a name="line.191"></a>
+<span class="sourceLineNo">192</span>    QueryType(byte[]... families) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      this.families = families;<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>    byte[][] getFamilies() {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      return this.families;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  }<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>  /** The delimiter for meta columns for replicaIds &amp;gt; 0 */<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  protected static final char META_REPLICA_ID_DELIMITER = '_';<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>  /** A regex for parsing server columns from meta. See above javadoc for meta layout */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  private static final Pattern SERVER_COLUMN_PATTERN<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    = Pattern.compile("^server(_[0-9a-fA-F]{4})?$");<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>  ////////////////////////<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  // Reading operations //<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  ////////////////////////<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>  /**<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * @param connection connection we're using<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * @param visitor Visitor invoked against each row in regions family.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   */<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  public static void fullScanRegions(Connection connection,<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      final Visitor visitor)<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      throws IOException {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    scanMeta(connection, null, null, QueryType.REGION, visitor);<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>  /**<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   * @param connection connection we're using<a name="line.225"></a>
 <span class="sourceLineNo">226</span>   */<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  public static void fullScanRegions(Connection connection,<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      final Visitor visitor)<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      throws IOException {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    scanMeta(connection, null, null, QueryType.REGION, visitor);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   * @param connection connection we're using<a name="line.235"></a>
+<span class="sourceLineNo">227</span>  public static List&lt;Result&gt; fullScanRegions(Connection connection)<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      throws IOException {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    return fullScan(connection, QueryType.REGION);<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>  /**<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for tables.<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * @param connection connection we're using<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * @param visitor Visitor invoked against each row in tables family.<a name="line.235"></a>
 <span class="sourceLineNo">236</span>   */<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  public static List&lt;Result&gt; fullScanRegions(Connection connection)<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      throws IOException {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    return fullScan(connection, QueryType.REGION);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for tables.<a name="line.243"></a>
-<span class="sourceLineNo">244</span>   * @param connection connection we're using<a name="line.244"></a>
-<span class="sourceLineNo">245</span>   * @param visitor Visitor invoked against each row in tables family.<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   */<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  public static void fullScanTables(Connection connection,<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      final Visitor visitor)<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      throws IOException {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    scanMeta(connection, null, null, QueryType.TABLE, visitor);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt;.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * @param connection connection we're using<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   * @param type scanned part of meta<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * @return List of {@link Result}<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  public static List&lt;Result&gt; fullScan(Connection connection, QueryType type)<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    throws IOException {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    CollectAllVisitor v = new CollectAllVisitor();<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    scanMeta(connection, null, null, type, v);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    return v.getResults();<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>  /**<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * Callers should call close on the returned {@link Table} instance.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * @param connection connection we're using to access Meta<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   * @return An {@link Table} for &lt;code&gt;hbase:meta&lt;/code&gt;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  public static Table getMetaHTable(final Connection connection)<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  throws IOException {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    // We used to pass whole CatalogTracker in here, now we just pass in Connection<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    if (connection == null) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      throw new NullPointerException("No connection");<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    } else if (connection.isClosed()) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      throw new IOException("connection is closed");<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    return connection.getTable(TableName.META_TABLE_NAME);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * @param t Table to use (will be closed when done).<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * @param g Get to run<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   */<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  private static Result get(final Table t, final Get g) throws IOException {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    if (t == null) return null;<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    try {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      return t.get(g);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    } finally {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      t.close();<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  /**<a name="line.295"></a>
-<span class="sourceLineNo">296</span>   * Gets the region info and assignment for the specified region.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   * @param connection connection we're using<a name="line.297"></a>
-<span class="sourceLineNo">298</span>   * @param regionName Region to lookup.<a name="line.298"></a>
-<span class="sourceLineNo">299</span>   * @return Location and RegionInfo for &lt;code&gt;regionName&lt;/code&gt;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * @deprecated use {@link #getRegionLocation(Connection, byte[])} instead<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  @Deprecated<a name="line.302"></a>
-<span class="sourceLineNo">303</span>  public static Pair&lt;RegionInfo, ServerName&gt; getRegion(Connection connection, byte [] regionName)<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    throws IOException {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    HRegionLocation location = getRegionLocation(connection, regionName);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    return location == null<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      ? null<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      : new Pair&lt;&gt;(location.getRegionInfo(), location.getServerName());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  /**<a name="line.311"></a>
-<span class="sourceLineNo">312</span>   * Returns the HRegionLocation from meta for the given region<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * @param connection connection we're using<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   * @param regionName region we're looking for<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   * @return HRegionLocation for the given region<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   */<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  public static HRegionLocation getRegionLocation(Connection connection, byte[] regionName)<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      throws IOException {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    byte[] row = regionName;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    RegionInfo parsedInfo = null;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    try {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      parsedInfo = parseRegionInfoFromRegionName(regionName);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      row = getMetaKeyForRegion(parsedInfo);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    } catch (Exception parseEx) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      // Ignore. This is used with tableName passed as regionName.<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    Get get = new Get(row);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    Result r = get(getMetaHTable(connection), get);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    RegionLocations locations = getRegionLocations(r);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    return locations == null ? null<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      : locations.getRegionLocation(parsedInfo == null ? 0 : parsedInfo.getReplicaId());<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  }<a name="line.333"></a>
-<span class="sourceLineNo">334</span><a name="line.334"></a>
-<span class="sourceLineNo">335</span>  /**<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   * Returns the HRegionLocation from meta for the given region<a name="line.336"></a>
-<span class="sourceLineNo">337</span>   * @param connection connection we're using<a name="line.337"></a>
-<span class="sourceLineNo">338</span>   * @param regionInfo region information<a name="line.338"></a>
-<span class="sourceLineNo">339</span>   * @return HRegionLocation for the given region<a name="line.339"></a>
-<span class="sourceLineNo">340</span>   */<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  public static HRegionLocation getRegionLocation(Connection connection, RegionInfo regionInfo)<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throws IOException {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    byte[] row = getMetaKeyForRegion(regionInfo);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    Get get = new Get(row);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    Result r = get(getMetaHTable(connection), get);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    return getRegionLocation(r, regionInfo, regionInfo.getReplicaId());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  }<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  /** Returns the row key to use for this regionInfo */<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  public static byte[] getMetaKeyForRegion(RegionInfo regionInfo) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    return RegionReplicaUtil.getRegionInfoForDefaultReplica(regionInfo).getRegionName();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  }<a name="line.353"></a>
-<span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>  /** Returns an HRI parsed from this regionName. Not all the fields of the HRI<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * is stored in the name, so the returned object should only be used for the fields<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   * in the regionName.<a name="line.357"></a>
-<span class="sourceLineNo">358</span>   */<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  public static RegionInfo parseRegionInfoFromRegionName(byte[] regionName) throws IOException {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    byte[][] fields = RegionInfo.parseRegionName(regionName);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    long regionId = Long.parseLong(Bytes.toString(fields[2]));<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    int replicaId = fields.length &gt; 3 ? Integer.parseInt(Bytes.toString(fields[3]), 16) : 0;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    return RegionInfoBuilder.newBuilder(TableName.valueOf(fields[0]))<a name="line.363"></a>
-<span class="sourceLineNo">364</span>              .setStartKey(fields[1])<a name="line.364"></a>
-<span class="sourceLineNo">365</span>              .setEndKey(fields[2])<a name="line.365"></a>
-<span class="sourceLineNo">366</span>              .setSplit(false)<a name="line.366"></a>
-<span class="sourceLineNo">367</span>              .setRegionId(regionId)<a name="line.367"></a>
-<span class="sourceLineNo">368</span>              .setReplicaId(replicaId)<a name="line.368"></a>
-<span class="sourceLineNo">369</span>              .build();<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>  /**<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * Gets the result in hbase:meta for the specified region.<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * @param connection connection we're using<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * @param regionName region we're looking for<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * @return result of the specified region<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   */<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public static Result getRegionResult(Connection connection,<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      byte[] regionName) throws IOException {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    Get get = new Get(regionName);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    return get(getMetaHTable(connection), get);<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>   * Get regions from the merge qualifier of the specified merged region<a name="line.386"></a>
-<span class="sourceLineNo">387</span>   * @return null if it doesn't contain merge qualifier, else two merge regions<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   */<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  @Nullable<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  public static Pair&lt;RegionInfo, RegionInfo&gt; getRegionsFromMergeQualifier(<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      Connection connection, byte[] regionName) throws IOException {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Result result = getRegionResult(connection, regionName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    RegionInfo mergeA = getRegionInfo(result, HConstants.MERGEA_QUALIFIER);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    RegionInfo mergeB = getRegionInfo(result, HConstants.MERGEB_QUALIFIER);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    if (mergeA == null &amp;&amp; mergeB == null) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      return null;<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    }<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    return new Pair&lt;&gt;(mergeA, mergeB);<a name="line.398"></a>
-<span class="sourceLineNo">399</span> }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>  /**<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * Checks if the specified table exists.  Looks at the hbase:meta table hosted on<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   * the specified server.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>   * @param connection connection we're using<a name="line.404"></a>
-<span class="sourceLineNo">405</span>   * @param tableName table to check<a name="line.405"></a>
-<span class="sourceLineNo">406</span>   * @return true if the table exists in meta, false if not<a name="line.406"></a>
-<span class="sourceLineNo">407</span>   */<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public static boolean tableExists(Connection connection,<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      final TableName tableName)<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  throws IOException {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // Catalog tables always exist.<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return tableName.equals(TableName.META_TABLE_NAME)<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        || getTableState(connection, tableName) != null;<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>   * Lists all of the regions currently in META.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   *<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   * @param connection to connect with<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   * @param excludeOfflinedSplitParents False if we are to include offlined/splitparents regions,<a name="line.420"></a>
-<span class="sourceLineNo">421</span>   *                                    true and we'll leave out offlined regions from returned list<a name="line.421"></a>
-<span class="sourceLineNo">422</span>   * @return List of all user-space regions.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   */<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  @VisibleForTesting<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  public static List&lt;RegionInfo&gt; getAllRegions(Connection connection,<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      boolean excludeOfflinedSplitParents)<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      throws IOException {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result;<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>    result = getTableRegionsAndLocations(connection, null,<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        excludeOfflinedSplitParents);<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>    return getListOfRegionInfos(result);<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  /**<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * @param connection connection we're using<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * @param tableName table we're looking for<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   */<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName)<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  throws IOException {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return getTableRegions(connection, tableName, false);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  /**<a name="line.449"></a>
-<span class="sourceLineNo">450</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.450"></a>
-<span class="sourceLineNo">451</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * @param connection connection we're using<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   * @param tableName table we're looking for<a name="line.453"></a>
-<span class="sourceLineNo">454</span>   * @param excludeOfflinedSplitParents If true, do not include offlined split<a name="line.454"></a>
-<span class="sourceLineNo">455</span>   * parents in the return.<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   */<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName,<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result =<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      getTableRegionsAndLocations(connection, tableName, excludeOfflinedSplitParents);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    return getListOfRegionInfos(result);<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>  private static List&lt;RegionInfo&gt; getListOfRegionInfos(<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      final List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    if (pairs == null || pairs.isEmpty()) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      return Collections.emptyList();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    List&lt;RegionInfo&gt; result = new ArrayList&lt;&gt;(pairs.size());<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      result.add(pair.getFirst());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    return result;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  }<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>  /**<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * @param tableName table we're working with<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * @return start row for scanning META according to query type<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   */<a name="line.480"></a>
-<span class="sourceLineNo">481</span>  public static byte[] getTableStartRowForMeta(TableName tableName, QueryType type) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    if (tableName == null) {<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      return null;<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    switch (type) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    case REGION:<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      byte[] startRow = new byte[tableName.getName().length + 2];<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      System.arraycopy(tableName.getName(), 0, startRow, 0, tableName.getName().length);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      startRow[startRow.length - 2] = HConstants.DELIMITER;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      startRow[startRow.length - 1] = HConstants.DELIMITER;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      return startRow;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    case ALL:<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    case TABLE:<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    default:<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      return tableName.getName();<a name="line.495"></a>
+<span class="sourceLineNo">237</span>  public static void fullScanTables(Connection connection,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      final Visitor visitor)<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      throws IOException {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    scanMeta(connection, null, null, QueryType.TABLE, visitor);<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>  /**<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt;.<a name="line.244"></a>
+<span class="sourceLineNo">245</span>   * @param connection connection we're using<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   * @param type scanned part of meta<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * @return List of {@link Result}<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   */<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  public static List&lt;Result&gt; fullScan(Connection connection, QueryType type)<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    throws IOException {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    CollectAllVisitor v = new CollectAllVisitor();<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    scanMeta(connection, null, null, type, v);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    return v.getResults();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  /**<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * Callers should call close on the returned {@link Table} instance.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * @param connection connection we're using to access Meta<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * @return An {@link Table} for &lt;code&gt;hbase:meta&lt;/code&gt;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  public static Table getMetaHTable(final Connection connection)<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  throws IOException {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    // We used to pass whole CatalogTracker in here, now we just pass in Connection<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    if (connection == null) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      throw new NullPointerException("No connection");<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    } else if (connection.isClosed()) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      throw new IOException("connection is closed");<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    return connection.getTable(TableName.META_TABLE_NAME);<a name="line.269"></a>
+<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  /**<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * @param t Table to use (will be closed when done).<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   * @param g Get to run<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  private static Result get(final Table t, final Get g) throws IOException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    if (t == null) return null;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    try {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      return t.get(g);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    } finally {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      t.close();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  }<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * Gets the region info and assignment for the specified region.<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * @param connection connection we're using<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * @param regionName Region to lookup.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * @return Location and RegionInfo for &lt;code&gt;regionName&lt;/code&gt;<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * @deprecated use {@link #getRegionLocation(Connection, byte[])} instead<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   */<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  @Deprecated<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  public static Pair&lt;RegionInfo, ServerName&gt; getRegion(Connection connection, byte [] regionName)<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    throws IOException {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    HRegionLocation location = getRegionLocation(connection, regionName);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    return location == null<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      ? null<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      : new Pair&lt;&gt;(location.getRegionInfo(), location.getServerName());<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>  /**<a name="line.301"></a>
+<span class="sourceLineNo">302</span>   * Returns the HRegionLocation from meta for the given region<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * @param connection connection we're using<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * @param regionName region we're looking for<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * @return HRegionLocation for the given region<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   */<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  public static HRegionLocation getRegionLocation(Connection connection, byte[] regionName)<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      throws IOException {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    byte[] row = regionName;<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    RegionInfo parsedInfo = null;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    try {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      parsedInfo = parseRegionInfoFromRegionName(regionName);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      row = getMetaKeyForRegion(parsedInfo);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    } catch (Exception parseEx) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      // Ignore. This is used with tableName passed as regionName.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    Get get = new Get(row);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    Result r = get(getMetaHTable(connection), get);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    RegionLocations locations = getRegionLocations(r);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return locations == null ? null<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      : locations.getRegionLocation(parsedInfo == null ? 0 : parsedInfo.getReplicaId());<a name="line.322"></a>
+<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
+<span class="sourceLineNo">324</span><a name="line.324"></a>
+<span class="sourceLineNo">325</span>  /**<a name="line.325"></a>
+<span class="sourceLineNo">326</span>   * Returns the HRegionLocation from meta for the given region<a name="line.326"></a>
+<span class="sourceLineNo">327</span>   * @param connection connection we're using<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   * @param regionInfo region information<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   * @return HRegionLocation for the given region<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   */<a name="line.330"></a>
+<span class="sourceLineNo">331</span>  public static HRegionLocation getRegionLocation(Connection connection, RegionInfo regionInfo)<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      throws IOException {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    byte[] row = getMetaKeyForRegion(regionInfo);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    Get get = new Get(row);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    Result r = get(getMetaHTable(connection), get);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    return getRegionLocation(r, regionInfo, regionInfo.getReplicaId());<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  }<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  /** Returns the row key to use for this regionInfo */<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  public static byte[] getMetaKeyForRegion(RegionInfo regionInfo) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    return RegionReplicaUtil.getRegionInfoForDefaultReplica(regionInfo).getRegionName();<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  /** Returns an HRI parsed from this regionName. Not all the fields of the HRI<a name="line.345"></a>
+<span class="sourceLineNo">346</span>   * is stored in the name, so the returned object should only be used for the fields<a name="line.346"></a>
+<span class="sourceLineNo">347</span>   * in the regionName.<a name="line.347"></a>
+<span class="sourceLineNo">348</span>   */<a name="line.348"></a>
+<span class="sourceLineNo">349</span>  public static RegionInfo parseRegionInfoFromRegionName(byte[] regionName) throws IOException {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    byte[][] fields = RegionInfo.parseRegionName(regionName);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    long regionId = Long.parseLong(Bytes.toString(fields[2]));<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    int replicaId = fields.length &gt; 3 ? Integer.parseInt(Bytes.toString(fields[3]), 16) : 0;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    return RegionInfoBuilder.newBuilder(TableName.valueOf(fields[0]))<a name="line.353"></a>
+<span class="sourceLineNo">354</span>              .setStartKey(fields[1])<a name="line.354"></a>
+<span class="sourceLineNo">355</span>              .setEndKey(fields[2])<a name="line.355"></a>
+<span class="sourceLineNo">356</span>              .setSplit(false)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>              .setRegionId(regionId)<a name="line.357"></a>
+<span class="sourceLineNo">358</span>              .setReplicaId(replicaId)<a name="line.358"></a>
+<span class="sourceLineNo">359</span>              .build();<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  }<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * Gets the result in hbase:meta for the specified region.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   * @param connection connection we're using<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   * @param regionName region we're looking for<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   * @return result of the specified region<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
+<span class="sourceLineNo">368</span>  public static Result getRegionResult(Connection connection,<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      byte[] regionName) throws IOException {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    Get get = new Get(regionName);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    return get(getMetaHTable(connection), get);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>  }<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>   * Get regions from the merge qualifier of the specified merged region<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * @return null if it doesn't contain merge qualifier, else two merge regions<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   */<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  @Nullable<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  public static Pair&lt;RegionInfo, RegionInfo&gt; getRegionsFromMergeQualifier(<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      Connection connection, byte[] regionName) throws IOException {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    Result result = getRegionResult(connection, regionName);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    RegionInfo mergeA = getRegionInfo(result, HConstants.MERGEA_QUALIFIER);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    RegionInfo mergeB = getRegionInfo(result, HConstants.MERGEB_QUALIFIER);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (mergeA == null &amp;&amp; mergeB == null) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return null;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    return new Pair&lt;&gt;(mergeA, mergeB);<a name="line.388"></a>
+<span class="sourceLineNo">389</span> }<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>   * Checks if the specified table exists.  Looks at the hbase:meta table hosted on<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * the specified server.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * @param connection connection we're using<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @param tableName table to check<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   * @return true if the table exists in meta, false if not<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   */<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  public static boolean tableExists(Connection connection,<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      final TableName tableName)<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  throws IOException {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // Catalog tables always exist.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    return tableName.equals(TableName.META_TABLE_NAME)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || getTableState(connection, tableName) != null;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  /**<a name="line.406"></a>
+<span class="sourceLineNo">407</span>   * Lists all of the regions currently in META.<a name="line.407"></a>
+<span class="sourceLineNo">408</span>   *<a name="line.408"></a>
+<span class="sourceLineNo">409</span>   * @param connection to connect with<a name="line.409"></a>
+<span class="sourceLineNo">410</span>   * @param excludeOfflinedSplitParents False if we are to include offlined/splitparents regions,<a name="line.410"></a>
+<span class="sourceLineNo">411</span>   *                                    true and we'll leave out offlined regions from returned list<a name="line.411"></a>
+<span class="sourceLineNo">412</span>   * @return List of all user-space regions.<a name="line.412"></a>
+<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
+<span class="sourceLineNo">414</span>  @VisibleForTesting<a name="line.414"></a>
+<span class="sourceLineNo">415</span>  public static List&lt;RegionInfo&gt; getAllRegions(Connection connection,<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      boolean excludeOfflinedSplitParents)<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      throws IOException {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result;<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    result = getTableRegionsAndLocations(connection, null,<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        excludeOfflinedSplitParents);<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>    return getListOfRegionInfos(result);<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>  }<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>  /**<a name="line.427"></a>
+<span class="sourceLineNo">428</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.428"></a>
+<span class="sourceLineNo">429</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.429"></a>
+<span class="sourceLineNo">430</span>   * @param connection connection we're using<a name="line.430"></a>
+<span class="sourceLineNo">431</span>   * @param tableName table we're looking for<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName)<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  throws IOException {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    return getTableRegions(connection, tableName, false);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  }<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>   * Gets all of the regions of the specified table. Do not use this method<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   * @param connection connection we're using<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @param tableName table we're looking for<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   * @param excludeOfflinedSplitParents If true, do not include offlined split<a name="line.444"></a>
+<span class="sourceLineNo">445</span>   * parents in the return.<a name="line.445"></a>
+<span class="sourceLineNo">446</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>   */<a name="line.447"></a>
+<span class="sourceLineNo">448</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName,<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result =<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      getTableRegionsAndLocations(connection, tableName, excludeOfflinedSplitParents);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    return getListOfRegionInfos(result);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  private static List&lt;RegionInfo&gt; getListOfRegionInfos(<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      final List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs) {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    if (pairs == null || pairs.isEmpty()) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      return Collections.emptyList();<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    List&lt;RegionInfo&gt; result = new ArrayList&lt;&gt;(pairs.size());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      result.add(pair.getFirst());<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    return result;<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>  /**<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * @param tableName table we're working with<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * @return start row for scanning META according to query type<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   */<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  public static byte[] getTableStartRowForMeta(TableName tableName, QueryType type) {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    if (tableName == null) {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      return null;<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    switch (type) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    case REGION:<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      byte[] startRow = new byte[tableName.getName().length + 2];<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      System.arraycopy(tableName.getName(), 0, startRow, 0, tableName.getName().length);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      startRow[startRow.length - 2] = HConstants.DELIMITER;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      startRow[startRow.length - 1] = HConstants.DELIMITER;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      return startRow;<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    case ALL:<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    case TABLE:<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    default:<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      return tableName.getName();<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    }<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>  /**<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * @param tableName table we're working with<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   * @return stop row for scanning META according to query type<a name="line.491"></a>
+<span class="sourceLineNo">492</span>   */<a name="line.492"></a>
+<span class="sourceLineNo">493</span>  public static byte[] getTableStopRowForMeta(TableName tableName, QueryType type) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    if (tableName == null) {<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return null;<a name="line.495"></a>
 <span class="sourceLineNo">496</span>    }<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>  /**<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   * @param tableName table we're working with<a name="line.500"></a>
-<span class="sourceLineNo">501</span>   * @return stop row for scanning META according to query type<a name="line.501"></a>
-<span class="sourceLineNo">502</span>   */<a name="line.502"></a>
-<span class="sourceLineNo">503</span>  public static byte[] getTableStopRowForMeta(TableName tableName, QueryType type) {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    if (tableName == null) {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      return null;<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    }<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    final byte[] stopRow;<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    switch (type) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    case REGION:<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      stopRow = new byte[tableName.getName().length + 3];<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      System.arraycopy(tableName.getName(), 0, stopRow, 0, tableName.getName().length);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      stopRow[stopRow.length - 3] = ' ';<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      stopRow[stopRow.length - 2] = HConstants.DELIMITER;<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      stopRow[stopRow.length - 1] = HConstants.DELIMITER;<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      break;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    case ALL:<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    case TABLE:<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    default:<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      stopRow = new byte[tableName.getName().length + 1];<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      System.arraycopy(tableName.getName(), 0, stopRow, 0, tableName.getName().length);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      stopRow[stopRow.length - 1] = ' ';<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      break;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    }<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    return stopRow;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * This method creates a Scan object that will only scan catalog rows that<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   * belong to the specified table. It doesn't specify any columns.<a name="line.529"></a>
-<span class="sourceLineNo">530</span>   * This is a better alternative to just using a start row and scan until<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * it hits a new table since that requires parsing the HRI to get the table<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   * name.<a name="line.532"></a>
-<span class="sourceLineNo">533</span>   * @param tableName bytes of table's name<a name="line.533"></a>
-<span class="sourceLineNo">534</span>   * @return configured Scan object<a name="line.534"></a>
-<span class="sourceLineNo">535</span>   */<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  @Deprecated<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  public static Scan getScanForTableName(Connection connection, TableName tableName) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    // Start key is just the table name with delimiters<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    byte[] startKey = getTableStartRowForMeta(tableName, QueryType.REGION);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    // Stop key appends the smallest possible char to the table name<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    byte[] stopKey = getTableStopRowForMeta(tableName, QueryType.REGION);<a name="line.541"></a>
-<span class="sourceLineNo">542</span><a name="line.542"></a>
-<span class="sourceLineNo">543</span>    Scan scan = getMetaScan(connection, -1);<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    scan.setStartRow(startKey);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    scan.setStopRow(stopKey);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    return scan;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>  private static Scan getMetaScan(Connection connection, int rowUpperLimit) {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    Scan scan = new Scan();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    int scannerCaching = connection.getConfiguration()<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        .getInt(HConstants.HBASE_META_SCANNER_CACHING,<a name="line.552"></a>
-<span class="sourceLineNo">553</span>            HConstants.DEFAULT_HBASE_META_SCANNER_CACHING);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    if (connection.getConfiguration().getBoolean(HConstants.USE_META_REPLICAS,<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        HConstants.DEFAULT_USE_META_REPLICAS)) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      scan.setConsistency(Consistency.TIMELINE);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    if (rowUpperLimit &gt; 0) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      scan.setLimit(rowUpperLimit);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      scan.setReadType(Scan.ReadType.PREAD);<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    scan.setCaching(scannerCaching);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    return scan;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  /**<a name="line.565"></a>
-<span class="sourceLineNo">566</span>   * Do not use this method to get meta table regions, use methods in MetaTableLocator instead.<a name="line.566"></a>
-<span class="sourceLineNo">567</span>   * @param connection connection we're using<a name="line.567"></a>
-<span class="sourceLineNo">568</span>   * @param tableName table we're looking for<a name="line.568"></a>
-<span class="sourceLineNo">569</span>   * @return Return list of regioninfos and server.<a name="line.569"></a>
-<span class="sourceLineNo">570</span>   * @throws IOException<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   */<a name="line.571"></a>
-<span class="sourceLineNo">572</span>  public static List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    getTableRegionsAndLocations(Connection connection, TableName tableName)<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      throws IOException {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    return getTableRegionsAndLocations(connection, tableName, true);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>  }<a name="line.576"></a>
-<span class="sourceLineNo">577</span><a name="line.577"></a>
-<span class="sourceLineNo">578</span>  /**<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   * Do not use this method to get meta table regions, use methods in MetaTableLocator instead.<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param connection connection we're using<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param tableName table to work with, can be null for getting all regions<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @param excludeOfflinedSplitParents don't return split parents<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   * @return Return list of regioninfos and server addresses.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   * @throws IOException<a name="line.584"></a>
-<span class="sourceLineNo">585</span>   */<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  public static List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; getTableRegionsAndLocations(<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      Connection connection, @Nullable final TableName tableName,<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    if (tableName != null &amp;&amp; tableName.equals(TableName.META_TABLE_NAME)) {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      throw new IOException("This method can't be used to locate meta regions;"<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        + " use MetaTableLocator instead");<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    }<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    // Make a version of CollectingVisitor that collects RegionInfo and ServerAddress<a name="line.593"></a>
-<span class="sourceLineNo">594</span>    CollectingVisitor&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; visitor =<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      new CollectingVisitor&lt;Pair&lt;RegionInfo, ServerName&gt;&gt;() {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>        private RegionLocations current = null;<a name="line.596"></a>
-<span class="sourceLineNo">597</span><a name="line.597"></a>
-<span class="sourceLineNo">598</span>        @Override<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        public boolean visit(Result r) throws IOException {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>          current = getRegionLocations(r);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          if (current == null || current.getRegionLocation().getRegion() == null) {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>            LOG.warn("No serialized RegionInfo in " + r);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>            return true;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>          }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          RegionInfo hri = current.getRegionLocation().getRegion();<a name="line.605"></a>
-<span class="sourceLineNo">606</span>          if (excludeOfflinedSplitParents &amp;&amp; hri.isSplitParent()) return true;<a name="line.606"></a>
-<span class="sourceLineNo">607</span>          // Else call super and add this Result to the collection.<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          return super.visit(r);<a name="line.608"></a>
-<span class="sourceLineNo">609</span>        }<a name="line.609"></a>
-<span class="sourceLineNo">610</span><a name="line.610"></a>
-<span class="sourceLineNo">611</span>        @Override<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        void add(Result r) {<a name="line.612"></a>
-<span class="sourceLineNo">613</span>          if (current == null) {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>            return;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>          }<a name="line.615"></a>
-<span class="sourceLineNo">616</span>          for (HRegionLocation loc : current.getRegionLocations()) {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>            if (loc != null) {<a name="line.617"></a>
-<span class="sourceLineNo">618</span>              this.results.add(new Pair&lt;&gt;(loc.getRegion(), loc.getServerName()));<a name="line.618"></a>
-<span class="sourceLineNo">619</span>            }<a name="line.619"></a>
-<span class="sourceLineNo">620</span>          }<a name="line.620"></a>
-<span class="sourceLineNo">621</span>        }<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      };<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    scanMeta(connection,<a name="line.623"></a>
-<span class="sourceLineNo">624</span>        getTableStartRowForMeta(tableName, QueryType.REGION),<a name="line.624"></a>
-<span class="sourceLineNo">625</span>        getTableStopRowForMeta(tableName, QueryType.REGION),<a name="line.625"></a>
-<span class="sourceLineNo">626</span>        QueryType.REGION, visitor);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    return visitor.getResults();<a name="line.627"></a>
-<span class="sourceLineNo">628</span>  }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>  /**<a name="line.630"></a>
-<span class="sourceLineNo">631</span>   * @param connection connection we're using<a name="line.631"></a>
-<span class="sourceLineNo">632</span>   * @param serverName server whose regions we're interested in<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * @return List of user regions installed on this server (does not include<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * catalog regions).<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   * @throws IOException<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   */<a name="line.636"></a>
-<span class="sourceLineNo">637</span>  public static NavigableMap&lt;RegionInfo, Result&gt;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>  getServerUserRegions(Connection connection, final ServerName serverName)<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    throws IOException {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    final NavigableMap&lt;RegionInfo, Result&gt; hris = new TreeMap&lt;&gt;();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    // Fill the above hris map with entries from hbase:meta that have the passed<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    // servername.<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    CollectingVisitor&lt;Result&gt; v = new CollectingVisitor&lt;Result&gt;() {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      @Override<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      void add(Result r) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        if (r == null || r.isEmpty()) return;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        RegionLocations locations = getRegionLocations(r);<a name="line.647"></a>
-<span class="sourceLineNo">648</span>        if (locations == null) return;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>          if (loc != null) {<a name="line.650"></a>
-<span class="sourceLineNo">651</span>            if (loc.getServerName() != null &amp;&amp; loc.getServerName().equals(serverName)) {<a name="line.651"></a>
-<span class="sourceLineNo">652</span>              hris.put(loc.getRegion(), r);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>            }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>          }<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    };<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    scanMeta(connection, null, null, QueryType.REGION, v);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    return hris;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>  }<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  public static void fullScanMetaAndPrint(Connection connection)<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    throws IOException {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    Visitor v = new Visitor() {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      @Override<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      public boolean visit(Result r) throws IOException {<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        if (r ==  null || r.isEmpty()) return true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        LOG.info("fullScanMetaAndPrint.Current Meta Row: " + r);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        TableState state = getTableState(r);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (state != null) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          LOG.info("Table State: " + state);<a name="line.671"></a>
-<span class="sourceLineNo">672</span>        } else {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>          RegionLocations locations = getRegionLocations(r);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>          if (locations == null) return true;<a name="line.674"></a>
-<span class="sourceLineNo">675</span>          for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.675"></a>
-<span class="sourceLineNo">676</span>            if (loc != null) {<a name="line.676"></a>
-<span class="sourceLineNo">677</span>              LOG.info("fullScanMetaAndPrint.HRI Print= " + loc.getRegion());<a name="line.677"></a>
-<span class="sourceLineNo">678</span>            }<a name="line.678"></a>
-<span class="sourceLineNo">679</span>          }<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        }<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        return true;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      }<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    };<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    scanMeta(connection, null, null, QueryType.ALL, v);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  }<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>  public static void scanMetaForTableRegions(Connection connection, Visitor visitor,<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      TableName tableName) throws IOException {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    scanMeta(connection, tableName, QueryType.REGION, Integer.MAX_VALUE, visitor);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>  }<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>  public static void scanMeta(Connection connection, TableName table, QueryType type, int maxRows,<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      final Visitor visitor) throws IOException {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    scanMeta(connection, getTableStartRowForMeta(table, type), getTableStopRowForMeta(table, type),<a name="line.694"></a>
-<sp

<TRUNCATED>

[48/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.html b/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.html
index 4ebc5d4..9090907 100644
--- a/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.html
+++ b/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.html
@@ -253,28 +253,24 @@ 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/MetaTableAccessor.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>private static byte[]</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.html#META_REGION_PREFIX">META_REGION_PREFIX</a></span></code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>protected static char</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.html#META_REPLICA_ID_DELIMITER">META_REPLICA_ID_DELIMITER</a></span></code>
 <div class="block">The delimiter for meta columns for replicaIds &gt; 0</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/MetaTableAccessor.html#METALOG">METALOG</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static byte[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.html#REPLICATION_PARENT_QUALIFIER">REPLICATION_PARENT_QUALIFIER</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static byte</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.html#SEPARATED_BYTE">SEPARATED_BYTE</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html?is-external=true" title="class or interface in java.util.regex">Pattern</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.html#SERVER_COLUMN_PATTERN">SERVER_COLUMN_PATTERN</a></span></code>
 <div class="block">A regex for parsing server columns from meta.</div>
@@ -1065,22 +1061,13 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.144">METALOG</a></pre>
 </li>
 </ul>
-<a name="META_REGION_PREFIX">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>META_REGION_PREFIX</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.146">META_REGION_PREFIX</a></pre>
-</li>
-</ul>
 <a name="REPLICATION_PARENT_QUALIFIER">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>REPLICATION_PARENT_QUALIFIER</h4>
-<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.157">REPLICATION_PARENT_QUALIFIER</a></pre>
+<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.147">REPLICATION_PARENT_QUALIFIER</a></pre>
 </li>
 </ul>
 <a name="ESCAPE_BYTE">
@@ -1089,7 +1076,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>ESCAPE_BYTE</h4>
-<pre>private static final&nbsp;byte <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.159">ESCAPE_BYTE</a></pre>
+<pre>private static final&nbsp;byte <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.149">ESCAPE_BYTE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.MetaTableAccessor.ESCAPE_BYTE">Constant Field Values</a></dd>
@@ -1102,7 +1089,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>SEPARATED_BYTE</h4>
-<pre>private static final&nbsp;byte <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.161">SEPARATED_BYTE</a></pre>
+<pre>private static final&nbsp;byte <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.151">SEPARATED_BYTE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.MetaTableAccessor.SEPARATED_BYTE">Constant Field Values</a></dd>
@@ -1115,7 +1102,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>META_REPLICA_ID_DELIMITER</h4>
-<pre>protected static final&nbsp;char <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.212">META_REPLICA_ID_DELIMITER</a></pre>
+<pre>protected static final&nbsp;char <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.202">META_REPLICA_ID_DELIMITER</a></pre>
 <div class="block">The delimiter for meta columns for replicaIds &gt; 0</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -1129,7 +1116,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SERVER_COLUMN_PATTERN</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html?is-external=true" title="class or interface in java.util.regex">Pattern</a> <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.215">SERVER_COLUMN_PATTERN</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html?is-external=true" title="class or interface in java.util.regex">Pattern</a> <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.205">SERVER_COLUMN_PATTERN</a></pre>
 <div class="block">A regex for parsing server columns from meta. See above javadoc for meta layout</div>
 </li>
 </ul>
@@ -1165,7 +1152,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <li class="blockList">
 <h4>allTableRegions</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.172">allTableRegions</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.162">allTableRegions</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                                                               <a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
                                                                        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"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">use <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.html#getTableRegionsAndLocations-org.apache.hadoop.hbase.client.Connection-org.apache.hadoop.hbase.TableName-"><code>getTableRegionsAndLocations(org.apache.hadoop.hbase.client.Connection, org.apache.hadoop.hbase.TableName)</code></a>, region can have multiple locations</span></div>
@@ -1188,7 +1175,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/
 <ul class="blockList">
 <li class="blockList">
 <h4>fullScanRegions</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.227">fullScanRegions</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.217">fullScanRegions</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                    <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html" title="interface in org.apache.hadoop.hbase">MetaTableAccessor.Visitor</a>&nbsp;visitor)
                             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">Performs a full scan of <code>hbase:meta</code> for regions.</div>
@@ -1207,7 +1194,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/
 <ul class="blockList">
 <li class="blockList">
 <h4>fullScanRegions</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.237">fullScanRegions</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection)
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.227">fullScanRegions</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection)
                                     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">Performs a full scan of <code>hbase:meta</code> for regions.</div>
 <dl>
@@ -1224,7 +1211,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/
 <ul class="blockList">
 <li class="blockList">
 <h4>fullScanTables</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.247">fullScanTables</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.237">fullScanTables</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                   <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html" title="interface in org.apache.hadoop.hbase">MetaTableAccessor.Visitor</a>&nbsp;visitor)
                            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">Performs a full scan of <code>hbase:meta</code> for tables.</div>
@@ -1243,7 +1230,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/
 <ul class="blockList">
 <li class="blockList">
 <h4>fullScan</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.259">fullScan</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.249">fullScan</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                     <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase">MetaTableAccessor.QueryType</a>&nbsp;type)
                              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">Performs a full scan of <code>hbase:meta</code>.</div>
@@ -1264,7 +1251,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/
 <ul class="blockList">
 <li class="blockList">
 <h4>getMetaHTable</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Table.html" title="interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.271">getMetaHTable</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection)
+<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Table.html" title="interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.261">getMetaHTable</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection)
                            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">Callers should call close on the returned <a href="../../../../org/apache/hadoop/hbase/client/Table.html" title="interface in org.apache.hadoop.hbase.client"><code>Table</code></a> instance.</div>
 <dl>
@@ -1283,7 +1270,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/
 <ul class="blockList">
 <li class="blockList">
 <h4>get</h4>
-<pre>private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.286">get</a>(<a href="../../../../org/apache/hadoop/hbase/client/Table.html" title="interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;t,
+<pre>private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.276">get</a>(<a href="../../../../org/apache/hadoop/hbase/client/Table.html" title="interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;t,
                           <a href="../../../../org/apache/hadoop/hbase/client/Get.html" title="class in org.apache.hadoop.hbase.client">Get</a>&nbsp;g)
                    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>
@@ -1302,7 +1289,7 @@ public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/
 <li class="blockList">
 <h4>getRegion</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.303">getRegion</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.293">getRegion</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                                                 byte[]&nbsp;regionName)
                                                          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"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">use <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.html#getRegionLocation-org.apache.hadoop.hbase.client.Connection-byte:A-"><code>getRegionLocation(Connection, byte[])</code></a> instead</span></div>
@@ -1324,7 +1311,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionLocation</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.317">getRegionLocation</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.307">getRegionLocation</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                                 byte[]&nbsp;regionName)
                                          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">Returns the HRegionLocation from meta for the given region</div>
@@ -1345,7 +1332,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionLocation</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.341">getRegionLocation</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.331">getRegionLocation</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                                 <a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)
                                          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">Returns the HRegionLocation from meta for the given region</div>
@@ -1366,7 +1353,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getMetaKeyForRegion</h4>
-<pre>public static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.351">getMetaKeyForRegion</a>(<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>public static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.341">getMetaKeyForRegion</a>(<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo)</pre>
 <div class="block">Returns the row key to use for this regionInfo</div>
 </li>
 </ul>
@@ -1376,7 +1363,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>parseRegionInfoFromRegionName</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.359">parseRegionInfoFromRegionName</a>(byte[]&nbsp;regionName)
+<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.349">parseRegionInfoFromRegionName</a>(byte[]&nbsp;regionName)
                                                 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">Returns an HRI parsed from this regionName. Not all the fields of the HRI
  is stored in the name, so the returned object should only be used for the fields
@@ -1393,7 +1380,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionResult</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.378">getRegionResult</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.368">getRegionResult</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                      byte[]&nbsp;regionName)
                               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">Gets the result in hbase:meta for the specified region.</div>
@@ -1415,7 +1402,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
 <li class="blockList">
 <h4>getRegionsFromMergeQualifier</h4>
 <pre>@Nullable
-public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.390">getRegionsFromMergeQualifier</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.380">getRegionsFromMergeQualifier</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                                                                  byte[]&nbsp;regionName)
                                                                           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">Get regions from the merge qualifier of the specified merged region</div>
@@ -1433,7 +1420,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>tableExists</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.408">tableExists</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.398">tableExists</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                   <a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
                            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">Checks if the specified table exists.  Looks at the hbase:meta table hosted on
@@ -1455,7 +1442,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getAllRegions</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.425">getAllRegions</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.415">getAllRegions</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                              boolean&nbsp;excludeOfflinedSplitParents)
                                       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">Lists all of the regions currently in META.</div>
@@ -1477,7 +1464,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableRegions</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.444">getTableRegions</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.434">getTableRegions</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                                <a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
                                         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">Gets all of the regions of the specified table. Do not use this method
@@ -1499,7 +1486,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableRegions</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.458">getTableRegions</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.448">getTableRegions</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                                <a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                                boolean&nbsp;excludeOfflinedSplitParents)
                                         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>
@@ -1524,7 +1511,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getListOfRegionInfos</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.465">getListOfRegionInfos</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&gt;&nbsp;pairs)</pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.455">getListOfRegionInfos</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&gt;&nbsp;pairs)</pre>
 </li>
 </ul>
 <a name="getTableStartRowForMeta-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.MetaTableAccessor.QueryType-">
@@ -1533,7 +1520,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableStartRowForMeta</h4>
-<pre>public static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.481">getTableStartRowForMeta</a>(<a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.471">getTableStartRowForMeta</a>(<a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                              <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase">MetaTableAccessor.QueryType</a>&nbsp;type)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1549,7 +1536,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableStopRowForMeta</h4>
-<pre>public static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.503">getTableStopRowForMeta</a>(<a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.493">getTableStopRowForMeta</a>(<a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                             <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase">MetaTableAccessor.QueryType</a>&nbsp;type)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1566,7 +1553,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
 <li class="blockList">
 <h4>getScanForTableName</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.537">getScanForTableName</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.527">getScanForTableName</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                                    <a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;</div>
 <div class="block">This method creates a Scan object that will only scan catalog rows that
@@ -1588,7 +1575,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Scan.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getMetaScan</h4>
-<pre>private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.549">getMetaScan</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.539">getMetaScan</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                 int&nbsp;rowUpperLimit)</pre>
 </li>
 </ul>
@@ -1598,7 +1585,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Scan.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableRegionsAndLocations</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.573">getTableRegionsAndLocations</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.563">getTableRegionsAndLocations</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                                                             <a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
                                                                      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">Do not use this method to get meta table regions, use methods in MetaTableLocator instead.</div>
@@ -1619,7 +1606,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Scan.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableRegionsAndLocations</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.586">getTableRegionsAndLocations</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.576">getTableRegionsAndLocations</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                                                             @Nullable
                                                                             <a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                                                             boolean&nbsp;excludeOfflinedSplitParents)
@@ -1643,7 +1630,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Scan.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getServerUserRegions</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.638">getServerUserRegions</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>,<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.628">getServerUserRegions</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                                                    <a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)
                                                             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>
@@ -1664,7 +1651,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Scan.html
 <ul class="blockList">
 <li class="blockList">
 <h4>fullScanMetaAndPrint</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.662">fullScanMetaAndPrint</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.652">fullScanMetaAndPrint</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection)
                                  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>
@@ -1678,7 +1665,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Scan.html
 <ul class="blockList">
 <li class="blockList">
 <h4>scanMetaForTableRegions</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.687">scanMetaForTableRegions</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.677">scanMetaForTableRegions</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                            <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html" title="interface in org.apache.hadoop.hbase">MetaTableAccessor.Visitor</a>&nbsp;visitor,
                                            <a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
                                     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>
@@ -1694,7 +1681,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Scan.html
 <ul class="blockList">
 <li class="blockList">
 <h4>scanMeta</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.692">scanMeta</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.682">scanMeta</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                             <a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table,
                             <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase">MetaTableAccessor.QueryType</a>&nbsp;type,
                             int&nbsp;maxRows,
@@ -1712,7 +1699,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Scan.html
 <ul class="blockList">
 <li class="blockList">
 <h4>scanMeta</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.698">scanMeta</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.688">scanMeta</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                             @Nullable
                             byte[]&nbsp;startRow,
                             @Nullable
@@ -1732,7 +1719,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Scan.html
 <ul class="blockList">
 <li class="blockList">
 <h4>scanMeta</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.713">scanMeta</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.703">scanMeta</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                             <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html" title="interface in org.apache.hadoop.hbase">MetaTableAccessor.Visitor</a>&nbsp;visitor,
                             <a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                             byte[]&nbsp;row,
@@ -1758,7 +1745,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Scan.html
 <ul class="blockList">
 <li class="blockList">
 <h4>scanMeta</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.741">scanMeta</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.731">scanMeta</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                             @Nullable
                             byte[]&nbsp;startRow,
                             @Nullable
@@ -1789,7 +1776,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Scan.html
 <ul class="blockList">
 <li class="blockList">
 <h4>scanMeta</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.747">scanMeta</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>private static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.737">scanMeta</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                              @Nullable
                              byte[]&nbsp;startRow,
                              @Nullable
@@ -1813,7 +1800,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Scan.html
 <li class="blockList">
 <h4>getClosestRegionInfo</h4>
 <pre>@NonNull
-private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.798">getClosestRegionInfo</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.788">getClosestRegionInfo</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                                         @NonNull
                                                         <a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                                         @NonNull
@@ -1833,7 +1820,7 @@ private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/RegionIn
 <ul class="blockList">
 <li class="blockList">
 <h4>getCatalogFamily</h4>
-<pre>private static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.823">getCatalogFamily</a>()</pre>
+<pre>private static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.813">getCatalogFamily</a>()</pre>
 <div class="block">Returns the column family used for meta columns.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -1847,7 +1834,7 @@ private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/RegionIn
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableFamily</h4>
-<pre>private static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.831">getTableFamily</a>()</pre>
+<pre>private static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.821">getTableFamily</a>()</pre>
 <div class="block">Returns the column family used for table columns.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -1861,7 +1848,7 @@ private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/RegionIn
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionInfoColumn</h4>
-<pre>private static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.839">getRegionInfoColumn</a>()</pre>
+<pre>private static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.829">getRegionInfoColumn</a>()</pre>
 <div class="block">Returns the column qualifier for serialized region info</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -1875,7 +1862,7 @@ private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/RegionIn
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableStateColumn</h4>
-<pre>private static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.847">getTableStateColumn</a>()</pre>
+<pre>private static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.837">getTableStateColumn</a>()</pre>
 <div class="block">Returns the column qualifier for serialized table state</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -1889,7 +1876,7 @@ private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/RegionIn
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionStateColumn</h4>
-<pre>private static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.855">getRegionStateColumn</a>()</pre>
+<pre>private static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.845">getRegionStateColumn</a>()</pre>
 <div class="block">Returns the column qualifier for serialized region state</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -1903,7 +1890,7 @@ private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/RegionIn
 <ul class="blockList">
 <li class="blockList">
 <h4>getServerColumn</h4>
-<pre>public static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.865">getServerColumn</a>(int&nbsp;replicaId)</pre>
+<pre>public static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.855">getServerColumn</a>(int&nbsp;replicaId)</pre>
 <div class="block">Returns the column qualifier for server column for replicaId</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1919,7 +1906,7 @@ private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/RegionIn
 <ul class="blockList">
 <li class="blockList">
 <h4>getStartCodeColumn</h4>
-<pre>public static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.878">getStartCodeColumn</a>(int&nbsp;replicaId)</pre>
+<pre>public static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.868">getStartCodeColumn</a>(int&nbsp;replicaId)</pre>
 <div class="block">Returns the column qualifier for server start code column for replicaId</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1935,7 +1922,7 @@ private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/RegionIn
 <ul class="blockList">
 <li class="blockList">
 <h4>getSeqNumColumn</h4>
-<pre>public static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.891">getSeqNumColumn</a>(int&nbsp;replicaId)</pre>
+<pre>public static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.881">getSeqNumColumn</a>(int&nbsp;replicaId)</pre>
 <div class="block">Returns the column qualifier for seqNum column for replicaId</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1951,7 +1938,7 @@ private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/RegionIn
 <ul class="blockList">
 <li class="blockList">
 <h4>parseReplicaIdFromServerColumn</h4>
-<pre>static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.905">parseReplicaIdFromServerColumn</a>(byte[]&nbsp;serverColumn)</pre>
+<pre>static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.895">parseReplicaIdFromServerColumn</a>(byte[]&nbsp;serverColumn)</pre>
 <div class="block">Parses the replicaId from the server column qualifier. See top of the class javadoc
  for the actual meta layout</div>
 <dl>
@@ -1970,7 +1957,7 @@ private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/RegionIn
 <h4>getServerName</h4>
 <pre>@Nullable
  @InterfaceAudience.Private
-public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.927">getServerName</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;r,
+public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.917">getServerName</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;r,
                                                                              int&nbsp;replicaId)</pre>
 <div class="block">Returns a <a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase"><code>ServerName</code></a> from catalog table <a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client"><code>Result</code></a>.</div>
 <dl>
@@ -1987,7 +1974,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/ServerName.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getSeqNumDuringOpen</h4>
-<pre>private static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.951">getSeqNumDuringOpen</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;r,
+<pre>private static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.941">getSeqNumDuringOpen</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;r,
                                         int&nbsp;replicaId)</pre>
 <div class="block">The latest seqnum that the server writing to meta observed when opening the region.
  E.g. the seqNum when the result of <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.html#getServerName-org.apache.hadoop.hbase.client.Result-int-"><code>getServerName(Result, int)</code></a> was written.</div>
@@ -2006,7 +1993,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/ServerName.html"
 <li class="blockList">
 <h4>getRegionLocations</h4>
 <pre>@Nullable
-public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.963">getRegionLocations</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;r)</pre>
+public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.953">getRegionLocations</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;r)</pre>
 <div class="block">Returns an HRegionLocationList extracted from the result.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -2021,7 +2008,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/RegionLocations.
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionLocation</h4>
-<pre>private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1011">getRegionLocation</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;r,
+<pre>private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1001">getRegionLocation</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;r,
                                                  <a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                                                  int&nbsp;replicaId)</pre>
 <div class="block">Returns the HRegionLocation parsed from the given meta row Result
@@ -2043,7 +2030,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/RegionLocations.
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionInfo</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1026">getRegionInfo</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;data)</pre>
+<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1016">getRegionInfo</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;data)</pre>
 <div class="block">Returns RegionInfo object from the column
  HConstants.CATALOG_FAMILY:HConstants.REGIONINFO_QUALIFIER of the catalog
  table Result.</div>
@@ -2062,7 +2049,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/RegionLocations.
 <li class="blockList">
 <h4>getRegionInfo</h4>
 <pre>@Nullable
-private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1038">getRegionInfo</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;r,
+private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1028">getRegionInfo</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;r,
                                                   byte[]&nbsp;qualifier)</pre>
 <div class="block">Returns the RegionInfo object from the column <a href="../../../../org/apache/hadoop/hbase/HConstants.html#CATALOG_FAMILY"><code>HConstants.CATALOG_FAMILY</code></a> and
  <code>qualifier</code> of the catalog table result.</div>
@@ -2081,7 +2068,7 @@ private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/RegionIn
 <ul class="blockList">
 <li class="blockList">
 <h4>getDaughterRegions</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/util/PairOfSameType.html" title="class in org.apache.hadoop.hbase.util">PairOfSameType</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1052">getDaughterRegions</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;data)</pre>
+<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/util/PairOfSameType.html" title="class in org.apache.hadoop.hbase.util">PairOfSameType</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1042">getDaughterRegions</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;data)</pre>
 <div class="block">Returns the daughter regions by reading the corresponding columns of the catalog table
  Result.</div>
 <dl>
@@ -2099,7 +2086,7 @@ private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/RegionIn
 <ul class="blockList">
 <li class="blockList">
 <h4>getMergeRegions</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/util/PairOfSameType.html" title="class in org.apache.hadoop.hbase.util">PairOfSameType</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1066">getMergeRegions</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;data)</pre>
+<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/util/PairOfSameType.html" title="class in org.apache.hadoop.hbase.util">PairOfSameType</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1056">getMergeRegions</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;data)</pre>
 <div class="block">Returns the merge regions by reading the corresponding columns of the catalog table
  Result.</div>
 <dl>
@@ -2118,7 +2105,7 @@ private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/RegionIn
 <li class="blockList">
 <h4>getTableState</h4>
 <pre>@Nullable
-public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/TableState.html" title="class in org.apache.hadoop.hbase.client">TableState</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1081">getTableState</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;conn,
+public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/TableState.html" title="class in org.apache.hadoop.hbase.client">TableState</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1071">getTableState</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;conn,
                                                  <a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
                                           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">Fetch table state for given table from META table</div>
@@ -2139,7 +2126,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/TableStat
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableStates</h4>
-<pre>public 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="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="../../../../org/apache/hadoop/hbase/client/TableState.html" title="class in org.apache.hadoop.hbase.client">TableState</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1098">getTableStates</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;conn)
+<pre>public 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="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="../../../../org/apache/hadoop/hbase/client/TableState.html" title="class in org.apache.hadoop.hbase.client">TableState</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1088">getTableStates</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;conn)
                                                 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">Fetch table states from META table</div>
 <dl>
@@ -2158,7 +2145,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/TableStat
 <ul class="blockList">
 <li class="blockList">
 <h4>updateTableState</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1120">updateTableState</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;conn,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1110">updateTableState</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;conn,
                                     <a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                     <a href="../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client">TableState.State</a>&nbsp;actual)
                              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>
@@ -2179,7 +2166,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/TableStat
 <li class="blockList">
 <h4>getTableState</h4>
 <pre>@Nullable
-public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/TableState.html" title="class in org.apache.hadoop.hbase.client">TableState</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1132">getTableState</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;r)
+public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/TableState.html" title="class in org.apache.hadoop.hbase.client">TableState</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1122">getTableState</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&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>
 <div class="block">Decode table state from META Result.
  Should contain cell from HConstants.TABLE_FAMILY</div>
@@ -2199,7 +2186,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/TableStat
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionCount</h4>
-<pre>public static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1258">getRegionCount</a>(org.apache.hadoop.conf.Configuration&nbsp;c,
+<pre>public static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1248">getRegionCount</a>(org.apache.hadoop.conf.Configuration&nbsp;c,
                                  <a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
                           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">Count regions in <code>hbase:meta</code> for passed table.</div>
@@ -2220,7 +2207,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/TableStat
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionCount</h4>
-<pre>public static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1271">getRegionCount</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1261">getRegionCount</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                  <a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
                           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">Count regions in <code>hbase:meta</code> for passed table.</div>
@@ -2241,7 +2228,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/TableStat
 <ul class="blockList">
 <li class="blockList">
 <h4>makePutFromRegionInfo</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1285">makePutFromRegionInfo</a>(<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
+<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1275">makePutFromRegionInfo</a>(<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                                         long&nbsp;ts)
                                  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">Generates and returns a Put containing the region into for the catalog table</div>
@@ -2257,7 +2244,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/TableStat
 <ul class="blockList">
 <li class="blockList">
 <h4>makeDeleteFromRegionInfo</h4>
-<pre>private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Delete.html" title="class in org.apache.hadoop.hbase.client">Delete</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1295">makeDeleteFromRegionInfo</a>(<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
+<pre>private static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Delete.html" title="class in org.apache.hadoop.hbase.client">Delete</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1285">makeDeleteFromRegionInfo</a>(<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
                                                long&nbsp;ts)</pre>
 <div class="block">Generates and returns a Delete containing the region info for the catalog
  table</div>
@@ -2269,7 +2256,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/TableStat
 <ul class="blockList">
 <li class="blockList">
 <h4>addDaughtersToPut</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1307">addDaughtersToPut</a>(<a href="../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;put,
+<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1297">addDaughtersToPut</a>(<a href="../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;put,
                                     <a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;splitA,
                                     <a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;splitB)
                              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>
@@ -2286,7 +2273,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/TableStat
 <ul class="blockList">
 <li class="blockList">
 <h4>putToMetaTable</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1337">putToMetaTable</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>private static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1327">putToMetaTable</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                    <a href="../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;p)
                             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">Put the passed <code>p</code> to the <code>hbase:meta</code> table.</div>
@@ -2305,7 +2292,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/TableStat
 <ul class="blockList">
 <li class="blockList">
 <h4>put</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1347">put</a>(<a href="../../../../org/apache/hadoop/hbase/client/Table.html" title="interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;t,
+<pre>private static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1337">put</a>(<a href="../../../../org/apache/hadoop/hbase/client/Table.html" title="interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;t,
                         <a href="../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;p)
                  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>
@@ -2323,7 +2310,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/TableStat
 <ul class="blockList">
 <li class="blockList">
 <h4>putsToMetaTable</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1357">putsToMetaTable</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1347">putsToMetaTable</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                                    <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&gt;&nbsp;ps)
                             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">Put the passed <code>ps</code> to the <code>hbase:meta</code> table.</div>
@@ -2342,7 +2329,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/client/TableStat
 <ul class="blockList">
 <li class="blockList">
 <h4>deleteFromMetaTable</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1370">deleteFromMetaTable</a>(<a href="../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;conne

<TRUNCATED>

[21/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span class="sourc

<TRUNCATED>

[04/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span class="sourc

<TRUNCATED>

[16/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span class="sourceLineNo">1

<TRUNCATED>

[09/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"

<TRUNCATED>

[40/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.TableVisitorBase.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.TableVisitorBase.html b/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.TableVisitorBase.html
index cdd2f36..fea2b5a 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.TableVisitorBase.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.TableVisitorBase.html
@@ -151,2029 +151,2019 @@
 <span class="sourceLineNo">143</span>  private static final Logger LOG = LoggerFactory.getLogger(MetaTableAccessor.class);<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  private static final Logger METALOG = LoggerFactory.getLogger("org.apache.hadoop.hbase.META");<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final byte[] META_REGION_PREFIX;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  static {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    // Copy the prefix from FIRST_META_REGIONINFO into META_REGION_PREFIX.<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    // FIRST_META_REGIONINFO == 'hbase:meta,,1'.  META_REGION_PREFIX == 'hbase:meta,'<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    int len = RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName().length - 2;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    META_REGION_PREFIX = new byte [len];<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    System.arraycopy(RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName(), 0,<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      META_REGION_PREFIX, 0, len);<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>  @VisibleForTesting<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  public static final byte[] REPLICATION_PARENT_QUALIFIER = Bytes.toBytes("parent");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private static final byte ESCAPE_BYTE = (byte) 0xFF;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  private static final byte SEPARATED_BYTE = 0x00;<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>  /**<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * Lists all of the table regions currently in META.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   * Deprecated, keep there until some test use this.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @param connection what we will use<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * @param tableName table to list<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * @return Map of all user-space regions to servers<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   * @deprecated use {@link #getTableRegionsAndLocations}, region can have multiple locations<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  @Deprecated<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  public static NavigableMap&lt;RegionInfo, ServerName&gt; allTableRegions(<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      Connection connection, final TableName tableName) throws IOException {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    final NavigableMap&lt;RegionInfo, ServerName&gt; regions = new TreeMap&lt;&gt;();<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    Visitor visitor = new TableVisitorBase(tableName) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      @Override<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      public boolean visitInternal(Result result) throws IOException {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>        RegionLocations locations = getRegionLocations(result);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        if (locations == null) return true;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>          if (loc != null) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>            RegionInfo regionInfo = loc.getRegionInfo();<a name="line.182"></a>
-<span class="sourceLineNo">183</span>            regions.put(regionInfo, loc.getServerName());<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>        return true;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    };<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    scanMetaForTableRegions(connection, visitor, tableName);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    return regions;<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>  @InterfaceAudience.Private<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public enum QueryType {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    ALL(HConstants.TABLE_FAMILY, HConstants.CATALOG_FAMILY),<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    REGION(HConstants.CATALOG_FAMILY),<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    TABLE(HConstants.TABLE_FAMILY),<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    REPLICATION(HConstants.REPLICATION_BARRIER_FAMILY);<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>    private final byte[][] families;<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>    QueryType(byte[]... families) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      this.families = families;<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>    byte[][] getFamilies() {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      return this.families;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  }<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span>  /** The delimiter for meta columns for replicaIds &amp;gt; 0 */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  protected static final char META_REPLICA_ID_DELIMITER = '_';<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>  /** A regex for parsing server columns from meta. See above javadoc for meta layout */<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  private static final Pattern SERVER_COLUMN_PATTERN<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    = Pattern.compile("^server(_[0-9a-fA-F]{4})?$");<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>  ////////////////////////<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  // Reading operations //<a name="line.219"></a>
-<span class="sourceLineNo">220</span>  ////////////////////////<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.223"></a>
-<span class="sourceLineNo">224</span>   * @param connection connection we're using<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * @param visitor Visitor invoked against each row in regions family.<a name="line.225"></a>
+<span class="sourceLineNo">146</span>  @VisibleForTesting<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  public static final byte[] REPLICATION_PARENT_QUALIFIER = Bytes.toBytes("parent");<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final byte ESCAPE_BYTE = (byte) 0xFF;<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final byte SEPARATED_BYTE = 0x00;<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  /**<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * Lists all of the table regions currently in META.<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * Deprecated, keep there until some test use this.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   * @param connection what we will use<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   * @param tableName table to list<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   * @return Map of all user-space regions to servers<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   * @deprecated use {@link #getTableRegionsAndLocations}, region can have multiple locations<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   */<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  @Deprecated<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  public static NavigableMap&lt;RegionInfo, ServerName&gt; allTableRegions(<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      Connection connection, final TableName tableName) throws IOException {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    final NavigableMap&lt;RegionInfo, ServerName&gt; regions = new TreeMap&lt;&gt;();<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    Visitor visitor = new TableVisitorBase(tableName) {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      @Override<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      public boolean visitInternal(Result result) throws IOException {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        RegionLocations locations = getRegionLocations(result);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        if (locations == null) return true;<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>          if (loc != null) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>            RegionInfo regionInfo = loc.getRegionInfo();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>            regions.put(regionInfo, loc.getServerName());<a name="line.173"></a>
+<span class="sourceLineNo">174</span>          }<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>        return true;<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      }<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    };<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    scanMetaForTableRegions(connection, visitor, tableName);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    return regions;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>  @InterfaceAudience.Private<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  public enum QueryType {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    ALL(HConstants.TABLE_FAMILY, HConstants.CATALOG_FAMILY),<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    REGION(HConstants.CATALOG_FAMILY),<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    TABLE(HConstants.TABLE_FAMILY),<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    REPLICATION(HConstants.REPLICATION_BARRIER_FAMILY);<a name="line.188"></a>
+<span class="sourceLineNo">189</span><a name="line.189"></a>
+<span class="sourceLineNo">190</span>    private final byte[][] families;<a name="line.190"></a>
+<span class="sourceLineNo">191</span><a name="line.191"></a>
+<span class="sourceLineNo">192</span>    QueryType(byte[]... families) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      this.families = families;<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>    byte[][] getFamilies() {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      return this.families;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  }<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>  /** The delimiter for meta columns for replicaIds &amp;gt; 0 */<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  protected static final char META_REPLICA_ID_DELIMITER = '_';<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>  /** A regex for parsing server columns from meta. See above javadoc for meta layout */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  private static final Pattern SERVER_COLUMN_PATTERN<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    = Pattern.compile("^server(_[0-9a-fA-F]{4})?$");<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>  ////////////////////////<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  // Reading operations //<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  ////////////////////////<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>  /**<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * @param connection connection we're using<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * @param visitor Visitor invoked against each row in regions family.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   */<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  public static void fullScanRegions(Connection connection,<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      final Visitor visitor)<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      throws IOException {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    scanMeta(connection, null, null, QueryType.REGION, visitor);<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>  /**<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   * @param connection connection we're using<a name="line.225"></a>
 <span class="sourceLineNo">226</span>   */<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  public static void fullScanRegions(Connection connection,<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      final Visitor visitor)<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      throws IOException {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    scanMeta(connection, null, null, QueryType.REGION, visitor);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   * @param connection connection we're using<a name="line.235"></a>
+<span class="sourceLineNo">227</span>  public static List&lt;Result&gt; fullScanRegions(Connection connection)<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      throws IOException {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    return fullScan(connection, QueryType.REGION);<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>  /**<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for tables.<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * @param connection connection we're using<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * @param visitor Visitor invoked against each row in tables family.<a name="line.235"></a>
 <span class="sourceLineNo">236</span>   */<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  public static List&lt;Result&gt; fullScanRegions(Connection connection)<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      throws IOException {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    return fullScan(connection, QueryType.REGION);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for tables.<a name="line.243"></a>
-<span class="sourceLineNo">244</span>   * @param connection connection we're using<a name="line.244"></a>
-<span class="sourceLineNo">245</span>   * @param visitor Visitor invoked against each row in tables family.<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   */<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  public static void fullScanTables(Connection connection,<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      final Visitor visitor)<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      throws IOException {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    scanMeta(connection, null, null, QueryType.TABLE, visitor);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt;.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * @param connection connection we're using<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   * @param type scanned part of meta<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * @return List of {@link Result}<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  public static List&lt;Result&gt; fullScan(Connection connection, QueryType type)<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    throws IOException {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    CollectAllVisitor v = new CollectAllVisitor();<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    scanMeta(connection, null, null, type, v);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    return v.getResults();<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>  /**<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * Callers should call close on the returned {@link Table} instance.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * @param connection connection we're using to access Meta<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   * @return An {@link Table} for &lt;code&gt;hbase:meta&lt;/code&gt;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  public static Table getMetaHTable(final Connection connection)<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  throws IOException {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    // We used to pass whole CatalogTracker in here, now we just pass in Connection<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    if (connection == null) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      throw new NullPointerException("No connection");<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    } else if (connection.isClosed()) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      throw new IOException("connection is closed");<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    return connection.getTable(TableName.META_TABLE_NAME);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * @param t Table to use (will be closed when done).<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * @param g Get to run<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   */<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  private static Result get(final Table t, final Get g) throws IOException {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    if (t == null) return null;<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    try {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      return t.get(g);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    } finally {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      t.close();<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  /**<a name="line.295"></a>
-<span class="sourceLineNo">296</span>   * Gets the region info and assignment for the specified region.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   * @param connection connection we're using<a name="line.297"></a>
-<span class="sourceLineNo">298</span>   * @param regionName Region to lookup.<a name="line.298"></a>
-<span class="sourceLineNo">299</span>   * @return Location and RegionInfo for &lt;code&gt;regionName&lt;/code&gt;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * @deprecated use {@link #getRegionLocation(Connection, byte[])} instead<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  @Deprecated<a name="line.302"></a>
-<span class="sourceLineNo">303</span>  public static Pair&lt;RegionInfo, ServerName&gt; getRegion(Connection connection, byte [] regionName)<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    throws IOException {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    HRegionLocation location = getRegionLocation(connection, regionName);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    return location == null<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      ? null<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      : new Pair&lt;&gt;(location.getRegionInfo(), location.getServerName());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  /**<a name="line.311"></a>
-<span class="sourceLineNo">312</span>   * Returns the HRegionLocation from meta for the given region<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * @param connection connection we're using<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   * @param regionName region we're looking for<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   * @return HRegionLocation for the given region<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   */<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  public static HRegionLocation getRegionLocation(Connection connection, byte[] regionName)<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      throws IOException {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    byte[] row = regionName;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    RegionInfo parsedInfo = null;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    try {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      parsedInfo = parseRegionInfoFromRegionName(regionName);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      row = getMetaKeyForRegion(parsedInfo);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    } catch (Exception parseEx) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      // Ignore. This is used with tableName passed as regionName.<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    Get get = new Get(row);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    Result r = get(getMetaHTable(connection), get);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    RegionLocations locations = getRegionLocations(r);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    return locations == null ? null<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      : locations.getRegionLocation(parsedInfo == null ? 0 : parsedInfo.getReplicaId());<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  }<a name="line.333"></a>
-<span class="sourceLineNo">334</span><a name="line.334"></a>
-<span class="sourceLineNo">335</span>  /**<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   * Returns the HRegionLocation from meta for the given region<a name="line.336"></a>
-<span class="sourceLineNo">337</span>   * @param connection connection we're using<a name="line.337"></a>
-<span class="sourceLineNo">338</span>   * @param regionInfo region information<a name="line.338"></a>
-<span class="sourceLineNo">339</span>   * @return HRegionLocation for the given region<a name="line.339"></a>
-<span class="sourceLineNo">340</span>   */<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  public static HRegionLocation getRegionLocation(Connection connection, RegionInfo regionInfo)<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throws IOException {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    byte[] row = getMetaKeyForRegion(regionInfo);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    Get get = new Get(row);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    Result r = get(getMetaHTable(connection), get);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    return getRegionLocation(r, regionInfo, regionInfo.getReplicaId());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  }<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  /** Returns the row key to use for this regionInfo */<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  public static byte[] getMetaKeyForRegion(RegionInfo regionInfo) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    return RegionReplicaUtil.getRegionInfoForDefaultReplica(regionInfo).getRegionName();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  }<a name="line.353"></a>
-<span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>  /** Returns an HRI parsed from this regionName. Not all the fields of the HRI<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * is stored in the name, so the returned object should only be used for the fields<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   * in the regionName.<a name="line.357"></a>
-<span class="sourceLineNo">358</span>   */<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  public static RegionInfo parseRegionInfoFromRegionName(byte[] regionName) throws IOException {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    byte[][] fields = RegionInfo.parseRegionName(regionName);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    long regionId = Long.parseLong(Bytes.toString(fields[2]));<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    int replicaId = fields.length &gt; 3 ? Integer.parseInt(Bytes.toString(fields[3]), 16) : 0;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    return RegionInfoBuilder.newBuilder(TableName.valueOf(fields[0]))<a name="line.363"></a>
-<span class="sourceLineNo">364</span>              .setStartKey(fields[1])<a name="line.364"></a>
-<span class="sourceLineNo">365</span>              .setEndKey(fields[2])<a name="line.365"></a>
-<span class="sourceLineNo">366</span>              .setSplit(false)<a name="line.366"></a>
-<span class="sourceLineNo">367</span>              .setRegionId(regionId)<a name="line.367"></a>
-<span class="sourceLineNo">368</span>              .setReplicaId(replicaId)<a name="line.368"></a>
-<span class="sourceLineNo">369</span>              .build();<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>  /**<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * Gets the result in hbase:meta for the specified region.<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * @param connection connection we're using<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * @param regionName region we're looking for<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * @return result of the specified region<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   */<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public static Result getRegionResult(Connection connection,<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      byte[] regionName) throws IOException {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    Get get = new Get(regionName);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    return get(getMetaHTable(connection), get);<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>   * Get regions from the merge qualifier of the specified merged region<a name="line.386"></a>
-<span class="sourceLineNo">387</span>   * @return null if it doesn't contain merge qualifier, else two merge regions<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   */<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  @Nullable<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  public static Pair&lt;RegionInfo, RegionInfo&gt; getRegionsFromMergeQualifier(<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      Connection connection, byte[] regionName) throws IOException {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Result result = getRegionResult(connection, regionName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    RegionInfo mergeA = getRegionInfo(result, HConstants.MERGEA_QUALIFIER);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    RegionInfo mergeB = getRegionInfo(result, HConstants.MERGEB_QUALIFIER);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    if (mergeA == null &amp;&amp; mergeB == null) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      return null;<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    }<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    return new Pair&lt;&gt;(mergeA, mergeB);<a name="line.398"></a>
-<span class="sourceLineNo">399</span> }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>  /**<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * Checks if the specified table exists.  Looks at the hbase:meta table hosted on<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   * the specified server.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>   * @param connection connection we're using<a name="line.404"></a>
-<span class="sourceLineNo">405</span>   * @param tableName table to check<a name="line.405"></a>
-<span class="sourceLineNo">406</span>   * @return true if the table exists in meta, false if not<a name="line.406"></a>
-<span class="sourceLineNo">407</span>   */<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public static boolean tableExists(Connection connection,<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      final TableName tableName)<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  throws IOException {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // Catalog tables always exist.<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return tableName.equals(TableName.META_TABLE_NAME)<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        || getTableState(connection, tableName) != null;<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>   * Lists all of the regions currently in META.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   *<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   * @param connection to connect with<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   * @param excludeOfflinedSplitParents False if we are to include offlined/splitparents regions,<a name="line.420"></a>
-<span class="sourceLineNo">421</span>   *                                    true and we'll leave out offlined regions from returned list<a name="line.421"></a>
-<span class="sourceLineNo">422</span>   * @return List of all user-space regions.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   */<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  @VisibleForTesting<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  public static List&lt;RegionInfo&gt; getAllRegions(Connection connection,<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      boolean excludeOfflinedSplitParents)<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      throws IOException {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result;<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>    result = getTableRegionsAndLocations(connection, null,<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        excludeOfflinedSplitParents);<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>    return getListOfRegionInfos(result);<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  /**<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * @param connection connection we're using<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * @param tableName table we're looking for<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   */<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName)<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  throws IOException {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return getTableRegions(connection, tableName, false);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  /**<a name="line.449"></a>
-<span class="sourceLineNo">450</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.450"></a>
-<span class="sourceLineNo">451</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * @param connection connection we're using<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   * @param tableName table we're looking for<a name="line.453"></a>
-<span class="sourceLineNo">454</span>   * @param excludeOfflinedSplitParents If true, do not include offlined split<a name="line.454"></a>
-<span class="sourceLineNo">455</span>   * parents in the return.<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   */<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName,<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result =<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      getTableRegionsAndLocations(connection, tableName, excludeOfflinedSplitParents);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    return getListOfRegionInfos(result);<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>  private static List&lt;RegionInfo&gt; getListOfRegionInfos(<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      final List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    if (pairs == null || pairs.isEmpty()) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      return Collections.emptyList();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    List&lt;RegionInfo&gt; result = new ArrayList&lt;&gt;(pairs.size());<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      result.add(pair.getFirst());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    return result;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  }<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>  /**<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * @param tableName table we're working with<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * @return start row for scanning META according to query type<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   */<a name="line.480"></a>
-<span class="sourceLineNo">481</span>  public static byte[] getTableStartRowForMeta(TableName tableName, QueryType type) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    if (tableName == null) {<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      return null;<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    switch (type) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    case REGION:<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      byte[] startRow = new byte[tableName.getName().length + 2];<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      System.arraycopy(tableName.getName(), 0, startRow, 0, tableName.getName().length);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      startRow[startRow.length - 2] = HConstants.DELIMITER;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      startRow[startRow.length - 1] = HConstants.DELIMITER;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      return startRow;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    case ALL:<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    case TABLE:<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    default:<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      return tableName.getName();<a name="line.495"></a>
+<span class="sourceLineNo">237</span>  public static void fullScanTables(Connection connection,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      final Visitor visitor)<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      throws IOException {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    scanMeta(connection, null, null, QueryType.TABLE, visitor);<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>  /**<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt;.<a name="line.244"></a>
+<span class="sourceLineNo">245</span>   * @param connection connection we're using<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   * @param type scanned part of meta<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * @return List of {@link Result}<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   */<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  public static List&lt;Result&gt; fullScan(Connection connection, QueryType type)<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    throws IOException {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    CollectAllVisitor v = new CollectAllVisitor();<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    scanMeta(connection, null, null, type, v);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    return v.getResults();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  /**<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * Callers should call close on the returned {@link Table} instance.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * @param connection connection we're using to access Meta<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * @return An {@link Table} for &lt;code&gt;hbase:meta&lt;/code&gt;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  public static Table getMetaHTable(final Connection connection)<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  throws IOException {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    // We used to pass whole CatalogTracker in here, now we just pass in Connection<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    if (connection == null) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      throw new NullPointerException("No connection");<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    } else if (connection.isClosed()) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      throw new IOException("connection is closed");<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    return connection.getTable(TableName.META_TABLE_NAME);<a name="line.269"></a>
+<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  /**<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * @param t Table to use (will be closed when done).<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   * @param g Get to run<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  private static Result get(final Table t, final Get g) throws IOException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    if (t == null) return null;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    try {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      return t.get(g);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    } finally {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      t.close();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  }<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * Gets the region info and assignment for the specified region.<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * @param connection connection we're using<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * @param regionName Region to lookup.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * @return Location and RegionInfo for &lt;code&gt;regionName&lt;/code&gt;<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * @deprecated use {@link #getRegionLocation(Connection, byte[])} instead<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   */<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  @Deprecated<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  public static Pair&lt;RegionInfo, ServerName&gt; getRegion(Connection connection, byte [] regionName)<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    throws IOException {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    HRegionLocation location = getRegionLocation(connection, regionName);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    return location == null<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      ? null<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      : new Pair&lt;&gt;(location.getRegionInfo(), location.getServerName());<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>  /**<a name="line.301"></a>
+<span class="sourceLineNo">302</span>   * Returns the HRegionLocation from meta for the given region<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * @param connection connection we're using<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * @param regionName region we're looking for<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * @return HRegionLocation for the given region<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   */<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  public static HRegionLocation getRegionLocation(Connection connection, byte[] regionName)<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      throws IOException {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    byte[] row = regionName;<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    RegionInfo parsedInfo = null;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    try {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      parsedInfo = parseRegionInfoFromRegionName(regionName);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      row = getMetaKeyForRegion(parsedInfo);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    } catch (Exception parseEx) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      // Ignore. This is used with tableName passed as regionName.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    Get get = new Get(row);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    Result r = get(getMetaHTable(connection), get);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    RegionLocations locations = getRegionLocations(r);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return locations == null ? null<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      : locations.getRegionLocation(parsedInfo == null ? 0 : parsedInfo.getReplicaId());<a name="line.322"></a>
+<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
+<span class="sourceLineNo">324</span><a name="line.324"></a>
+<span class="sourceLineNo">325</span>  /**<a name="line.325"></a>
+<span class="sourceLineNo">326</span>   * Returns the HRegionLocation from meta for the given region<a name="line.326"></a>
+<span class="sourceLineNo">327</span>   * @param connection connection we're using<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   * @param regionInfo region information<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   * @return HRegionLocation for the given region<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   */<a name="line.330"></a>
+<span class="sourceLineNo">331</span>  public static HRegionLocation getRegionLocation(Connection connection, RegionInfo regionInfo)<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      throws IOException {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    byte[] row = getMetaKeyForRegion(regionInfo);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    Get get = new Get(row);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    Result r = get(getMetaHTable(connection), get);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    return getRegionLocation(r, regionInfo, regionInfo.getReplicaId());<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  }<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  /** Returns the row key to use for this regionInfo */<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  public static byte[] getMetaKeyForRegion(RegionInfo regionInfo) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    return RegionReplicaUtil.getRegionInfoForDefaultReplica(regionInfo).getRegionName();<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  /** Returns an HRI parsed from this regionName. Not all the fields of the HRI<a name="line.345"></a>
+<span class="sourceLineNo">346</span>   * is stored in the name, so the returned object should only be used for the fields<a name="line.346"></a>
+<span class="sourceLineNo">347</span>   * in the regionName.<a name="line.347"></a>
+<span class="sourceLineNo">348</span>   */<a name="line.348"></a>
+<span class="sourceLineNo">349</span>  public static RegionInfo parseRegionInfoFromRegionName(byte[] regionName) throws IOException {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    byte[][] fields = RegionInfo.parseRegionName(regionName);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    long regionId = Long.parseLong(Bytes.toString(fields[2]));<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    int replicaId = fields.length &gt; 3 ? Integer.parseInt(Bytes.toString(fields[3]), 16) : 0;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    return RegionInfoBuilder.newBuilder(TableName.valueOf(fields[0]))<a name="line.353"></a>
+<span class="sourceLineNo">354</span>              .setStartKey(fields[1])<a name="line.354"></a>
+<span class="sourceLineNo">355</span>              .setEndKey(fields[2])<a name="line.355"></a>
+<span class="sourceLineNo">356</span>              .setSplit(false)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>              .setRegionId(regionId)<a name="line.357"></a>
+<span class="sourceLineNo">358</span>              .setReplicaId(replicaId)<a name="line.358"></a>
+<span class="sourceLineNo">359</span>              .build();<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  }<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * Gets the result in hbase:meta for the specified region.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   * @param connection connection we're using<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   * @param regionName region we're looking for<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   * @return result of the specified region<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
+<span class="sourceLineNo">368</span>  public static Result getRegionResult(Connection connection,<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      byte[] regionName) throws IOException {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    Get get = new Get(regionName);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    return get(getMetaHTable(connection), get);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>  }<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>   * Get regions from the merge qualifier of the specified merged region<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * @return null if it doesn't contain merge qualifier, else two merge regions<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   */<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  @Nullable<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  public static Pair&lt;RegionInfo, RegionInfo&gt; getRegionsFromMergeQualifier(<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      Connection connection, byte[] regionName) throws IOException {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    Result result = getRegionResult(connection, regionName);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    RegionInfo mergeA = getRegionInfo(result, HConstants.MERGEA_QUALIFIER);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    RegionInfo mergeB = getRegionInfo(result, HConstants.MERGEB_QUALIFIER);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (mergeA == null &amp;&amp; mergeB == null) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return null;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    return new Pair&lt;&gt;(mergeA, mergeB);<a name="line.388"></a>
+<span class="sourceLineNo">389</span> }<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>   * Checks if the specified table exists.  Looks at the hbase:meta table hosted on<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * the specified server.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * @param connection connection we're using<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @param tableName table to check<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   * @return true if the table exists in meta, false if not<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   */<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  public static boolean tableExists(Connection connection,<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      final TableName tableName)<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  throws IOException {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // Catalog tables always exist.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    return tableName.equals(TableName.META_TABLE_NAME)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || getTableState(connection, tableName) != null;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  /**<a name="line.406"></a>
+<span class="sourceLineNo">407</span>   * Lists all of the regions currently in META.<a name="line.407"></a>
+<span class="sourceLineNo">408</span>   *<a name="line.408"></a>
+<span class="sourceLineNo">409</span>   * @param connection to connect with<a name="line.409"></a>
+<span class="sourceLineNo">410</span>   * @param excludeOfflinedSplitParents False if we are to include offlined/splitparents regions,<a name="line.410"></a>
+<span class="sourceLineNo">411</span>   *                                    true and we'll leave out offlined regions from returned list<a name="line.411"></a>
+<span class="sourceLineNo">412</span>   * @return List of all user-space regions.<a name="line.412"></a>
+<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
+<span class="sourceLineNo">414</span>  @VisibleForTesting<a name="line.414"></a>
+<span class="sourceLineNo">415</span>  public static List&lt;RegionInfo&gt; getAllRegions(Connection connection,<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      boolean excludeOfflinedSplitParents)<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      throws IOException {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result;<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    result = getTableRegionsAndLocations(connection, null,<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        excludeOfflinedSplitParents);<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>    return getListOfRegionInfos(result);<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>  }<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>  /**<a name="line.427"></a>
+<span class="sourceLineNo">428</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.428"></a>
+<span class="sourceLineNo">429</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.429"></a>
+<span class="sourceLineNo">430</span>   * @param connection connection we're using<a name="line.430"></a>
+<span class="sourceLineNo">431</span>   * @param tableName table we're looking for<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName)<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  throws IOException {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    return getTableRegions(connection, tableName, false);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  }<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>   * Gets all of the regions of the specified table. Do not use this method<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   * @param connection connection we're using<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @param tableName table we're looking for<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   * @param excludeOfflinedSplitParents If true, do not include offlined split<a name="line.444"></a>
+<span class="sourceLineNo">445</span>   * parents in the return.<a name="line.445"></a>
+<span class="sourceLineNo">446</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>   */<a name="line.447"></a>
+<span class="sourceLineNo">448</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName,<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result =<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      getTableRegionsAndLocations(connection, tableName, excludeOfflinedSplitParents);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    return getListOfRegionInfos(result);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  private static List&lt;RegionInfo&gt; getListOfRegionInfos(<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      final List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs) {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    if (pairs == null || pairs.isEmpty()) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      return Collections.emptyList();<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    List&lt;RegionInfo&gt; result = new ArrayList&lt;&gt;(pairs.size());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      result.add(pair.getFirst());<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    return result;<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>  /**<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * @param tableName table we're working with<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * @return start row for scanning META according to query type<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   */<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  public static byte[] getTableStartRowForMeta(TableName tableName, QueryType type) {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    if (tableName == null) {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      return null;<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    switch (type) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    case REGION:<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      byte[] startRow = new byte[tableName.getName().length + 2];<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      System.arraycopy(tableName.getName(), 0, startRow, 0, tableName.getName().length);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      startRow[startRow.length - 2] = HConstants.DELIMITER;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      startRow[startRow.length - 1] = HConstants.DELIMITER;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      return startRow;<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    case ALL:<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    case TABLE:<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    default:<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      return tableName.getName();<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    }<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>  /**<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * @param tableName table we're working with<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   * @return stop row for scanning META according to query type<a name="line.491"></a>
+<span class="sourceLineNo">492</span>   */<a name="line.492"></a>
+<span class="sourceLineNo">493</span>  public static byte[] getTableStopRowForMeta(TableName tableName, QueryType type) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    if (tableName == null) {<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return null;<a name="line.495"></a>
 <span class="sourceLineNo">496</span>    }<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>  /**<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   * @param tableName table we're working with<a name="line.500"></a>
-<span class="sourceLineNo">501</span>   * @return stop row for scanning META according to query type<a name="line.501"></a>
-<span class="sourceLineNo">502</span>   */<a name="line.502"></a>
-<span class="sourceLineNo">503</span>  public static byte[] getTableStopRowForMeta(TableName tableName, QueryType type) {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    if (tableName == null) {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      return null;<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    }<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    final byte[] stopRow;<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    switch (type) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    case REGION:<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      stopRow = new byte[tableName.getName().length + 3];<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      System.arraycopy(tableName.getName(), 0, stopRow, 0, tableName.getName().length);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      stopRow[stopRow.length - 3] = ' ';<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      stopRow[stopRow.length - 2] = HConstants.DELIMITER;<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      stopRow[stopRow.length - 1] = HConstants.DELIMITER;<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      break;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    case ALL:<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    case TABLE:<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    default:<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      stopRow = new byte[tableName.getName().length + 1];<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      System.arraycopy(tableName.getName(), 0, stopRow, 0, tableName.getName().length);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      stopRow[stopRow.length - 1] = ' ';<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      break;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    }<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    return stopRow;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * This method creates a Scan object that will only scan catalog rows that<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   * belong to the specified table. It doesn't specify any columns.<a name="line.529"></a>
-<span class="sourceLineNo">530</span>   * This is a better alternative to just using a start row and scan until<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * it hits a new table since that requires parsing the HRI to get the table<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   * name.<a name="line.532"></a>
-<span class="sourceLineNo">533</span>   * @param tableName bytes of table's name<a name="line.533"></a>
-<span class="sourceLineNo">534</span>   * @return configured Scan object<a name="line.534"></a>
-<span class="sourceLineNo">535</span>   */<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  @Deprecated<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  public static Scan getScanForTableName(Connection connection, TableName tableName) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    // Start key is just the table name with delimiters<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    byte[] startKey = getTableStartRowForMeta(tableName, QueryType.REGION);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    // Stop key appends the smallest possible char to the table name<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    byte[] stopKey = getTableStopRowForMeta(tableName, QueryType.REGION);<a name="line.541"></a>
-<span class="sourceLineNo">542</span><a name="line.542"></a>
-<span class="sourceLineNo">543</span>    Scan scan = getMetaScan(connection, -1);<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    scan.setStartRow(startKey);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    scan.setStopRow(stopKey);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    return scan;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>  private static Scan getMetaScan(Connection connection, int rowUpperLimit) {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    Scan scan = new Scan();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    int scannerCaching = connection.getConfiguration()<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        .getInt(HConstants.HBASE_META_SCANNER_CACHING,<a name="line.552"></a>
-<span class="sourceLineNo">553</span>            HConstants.DEFAULT_HBASE_META_SCANNER_CACHING);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    if (connection.getConfiguration().getBoolean(HConstants.USE_META_REPLICAS,<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        HConstants.DEFAULT_USE_META_REPLICAS)) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      scan.setConsistency(Consistency.TIMELINE);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    if (rowUpperLimit &gt; 0) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      scan.setLimit(rowUpperLimit);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      scan.setReadType(Scan.ReadType.PREAD);<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    scan.setCaching(scannerCaching);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    return scan;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  /**<a name="line.565"></a>
-<span class="sourceLineNo">566</span>   * Do not use this method to get meta table regions, use methods in MetaTableLocator instead.<a name="line.566"></a>
-<span class="sourceLineNo">567</span>   * @param connection connection we're using<a name="line.567"></a>
-<span class="sourceLineNo">568</span>   * @param tableName table we're looking for<a name="line.568"></a>
-<span class="sourceLineNo">569</span>   * @return Return list of regioninfos and server.<a name="line.569"></a>
-<span class="sourceLineNo">570</span>   * @throws IOException<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   */<a name="line.571"></a>
-<span class="sourceLineNo">572</span>  public static List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    getTableRegionsAndLocations(Connection connection, TableName tableName)<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      throws IOException {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    return getTableRegionsAndLocations(connection, tableName, true);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>  }<a name="line.576"></a>
-<span class="sourceLineNo">577</span><a name="line.577"></a>
-<span class="sourceLineNo">578</span>  /**<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   * Do not use this method to get meta table regions, use methods in MetaTableLocator instead.<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param connection connection we're using<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param tableName table to work with, can be null for getting all regions<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @param excludeOfflinedSplitParents don't return split parents<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   * @return Return list of regioninfos and server addresses.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   * @throws IOException<a name="line.584"></a>
-<span class="sourceLineNo">585</span>   */<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  public static List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; getTableRegionsAndLocations(<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      Connection connection, @Nullable final TableName tableName,<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    if (tableName != null &amp;&amp; tableName.equals(TableName.META_TABLE_NAME)) {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      throw new IOException("This method can't be used to locate meta regions;"<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        + " use MetaTableLocator instead");<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    }<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    // Make a version of CollectingVisitor that collects RegionInfo and ServerAddress<a name="line.593"></a>
-<span class="sourceLineNo">594</span>    CollectingVisitor&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; visitor =<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      new CollectingVisitor&lt;Pair&lt;RegionInfo, ServerName&gt;&gt;() {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>        private RegionLocations current = null;<a name="line.596"></a>
-<span class="sourceLineNo">597</span><a name="line.597"></a>
-<span class="sourceLineNo">598</span>        @Override<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        public boolean visit(Result r) throws IOException {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>          current = getRegionLocations(r);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          if (current == null || current.getRegionLocation().getRegion() == null) {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>            LOG.warn("No serialized RegionInfo in " + r);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>            return true;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>          }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          RegionInfo hri = current.getRegionLocation().getRegion();<a name="line.605"></a>
-<span class="sourceLineNo">606</span>          if (excludeOfflinedSplitParents &amp;&amp; hri.isSplitParent()) return true;<a name="line.606"></a>
-<span class="sourceLineNo">607</span>          // Else call super and add this Result to the collection.<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          return super.visit(r);<a name="line.608"></a>
-<span class="sourceLineNo">609</span>        }<a name="line.609"></a>
-<span class="sourceLineNo">610</span><a name="line.610"></a>
-<span class="sourceLineNo">611</span>        @Override<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        void add(Result r) {<a name="line.612"></a>
-<span class="sourceLineNo">613</span>          if (current == null) {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>            return;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>          }<a name="line.615"></a>
-<span class="sourceLineNo">616</span>          for (HRegionLocation loc : current.getRegionLocations()) {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>            if (loc != null) {<a name="line.617"></a>
-<span class="sourceLineNo">618</span>              this.results.add(new Pair&lt;&gt;(loc.getRegion(), loc.getServerName()));<a name="line.618"></a>
-<span class="sourceLineNo">619</span>            }<a name="line.619"></a>
-<span class="sourceLineNo">620</span>          }<a name="line.620"></a>
-<span class="sourceLineNo">621</span>        }<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      };<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    scanMeta(connection,<a name="line.623"></a>
-<span class="sourceLineNo">624</span>        getTableStartRowForMeta(tableName, QueryType.REGION),<a name="line.624"></a>
-<span class="sourceLineNo">625</span>        getTableStopRowForMeta(tableName, QueryType.REGION),<a name="line.625"></a>
-<span class="sourceLineNo">626</span>        QueryType.REGION, visitor);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    return visitor.getResults();<a name="line.627"></a>
-<span class="sourceLineNo">628</span>  }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>  /**<a name="line.630"></a>
-<span class="sourceLineNo">631</span>   * @param connection connection we're using<a name="line.631"></a>
-<span class="sourceLineNo">632</span>   * @param serverName server whose regions we're interested in<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * @return List of user regions installed on this server (does not include<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * catalog regions).<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   * @throws IOException<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   */<a name="line.636"></a>
-<span class="sourceLineNo">637</span>  public static NavigableMap&lt;RegionInfo, Result&gt;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>  getServerUserRegions(Connection connection, final ServerName serverName)<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    throws IOException {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    final NavigableMap&lt;RegionInfo, Result&gt; hris = new TreeMap&lt;&gt;();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    // Fill the above hris map with entries from hbase:meta that have the passed<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    // servername.<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    CollectingVisitor&lt;Result&gt; v = new CollectingVisitor&lt;Result&gt;() {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      @Override<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      void add(Result r) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        if (r == null || r.isEmpty()) return;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        RegionLocations locations = getRegionLocations(r);<a name="line.647"></a>
-<span class="sourceLineNo">648</span>        if (locations == null) return;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>          if (loc != null) {<a name="line.650"></a>
-<span class="sourceLineNo">651</span>            if (loc.getServerName() != null &amp;&amp; loc.getServerName().equals(serverName)) {<a name="line.651"></a>
-<span class="sourceLineNo">652</span>              hris.put(loc.getRegion(), r);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>            }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>          }<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    };<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    scanMeta(connection, null, null, QueryType.REGION, v);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    return hris;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>  }<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  public static void fullScanMetaAndPrint(Connection connection)<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    throws IOException {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    Visitor v = new Visitor() {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      @Override<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      public boolean visit(Result r) throws IOException {<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        if (r ==  null || r.isEmpty()) return true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        LOG.info("fullScanMetaAndPrint.Current Meta Row: " + r);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        TableState state = getTableState(r);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (state != null) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          LOG.info("Table State: " + state);<a name="line.671"></a>
-<span class="sourceLineNo">672</span>        } else {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>          RegionLocations locations = getRegionLocations(r);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>          if (locations == null) return true;<a name="line.674"></a>
-<span class="sourceLineNo">675</span>          for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.675"></a>
-<span class="sourceLineNo">676</span>            if (loc != null) {<a name="line.676"></a>
-<span class="sourceLineNo">677</span>              LOG.info("fullScanMetaAndPrint.HRI Print= " + loc.getRegion());<a name="line.677"></a>
-<span class="sourceLineNo">678</span>            }<a name="line.678"></a>
-<span class="sourceLineNo">679</span>          }<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        }<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        return true;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      }<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    };<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    scanMeta(connection, null, null, QueryType.ALL, v);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  }<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>  public static void scanMetaForTableRegions(Connection connection, Visitor visitor,<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      TableName tableName) throws IOException {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    scanMeta(connection, tableName, QueryType.REGION, Integer.MAX_VALUE, visitor);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>  }<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>  public static void scanMeta(Connection connection, TableName table, QueryType type, int maxRows,<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      final Visitor visitor) throws IOException {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    scanMeta(connection, getTableStartRowForMeta(table, type), getTableStopRowForMeta(table, type),<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      

<TRUNCATED>

[07/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span class="sourceLineNo">1455</

<TRUNCATED>

[27/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.

<TRUNCATED>

[29/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>     

<TRUNCATED>

[08/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span class="sourc

<TRUNCATED>

[24/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span class="

<TRUNCATED>

[42/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html b/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html
index cdd2f36..fea2b5a 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html
@@ -151,2029 +151,2019 @@
 <span class="sourceLineNo">143</span>  private static final Logger LOG = LoggerFactory.getLogger(MetaTableAccessor.class);<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  private static final Logger METALOG = LoggerFactory.getLogger("org.apache.hadoop.hbase.META");<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final byte[] META_REGION_PREFIX;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  static {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    // Copy the prefix from FIRST_META_REGIONINFO into META_REGION_PREFIX.<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    // FIRST_META_REGIONINFO == 'hbase:meta,,1'.  META_REGION_PREFIX == 'hbase:meta,'<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    int len = RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName().length - 2;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    META_REGION_PREFIX = new byte [len];<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    System.arraycopy(RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName(), 0,<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      META_REGION_PREFIX, 0, len);<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>  @VisibleForTesting<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  public static final byte[] REPLICATION_PARENT_QUALIFIER = Bytes.toBytes("parent");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private static final byte ESCAPE_BYTE = (byte) 0xFF;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  private static final byte SEPARATED_BYTE = 0x00;<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>  /**<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * Lists all of the table regions currently in META.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   * Deprecated, keep there until some test use this.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @param connection what we will use<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * @param tableName table to list<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * @return Map of all user-space regions to servers<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   * @deprecated use {@link #getTableRegionsAndLocations}, region can have multiple locations<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  @Deprecated<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  public static NavigableMap&lt;RegionInfo, ServerName&gt; allTableRegions(<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      Connection connection, final TableName tableName) throws IOException {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    final NavigableMap&lt;RegionInfo, ServerName&gt; regions = new TreeMap&lt;&gt;();<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    Visitor visitor = new TableVisitorBase(tableName) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      @Override<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      public boolean visitInternal(Result result) throws IOException {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>        RegionLocations locations = getRegionLocations(result);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        if (locations == null) return true;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>          if (loc != null) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>            RegionInfo regionInfo = loc.getRegionInfo();<a name="line.182"></a>
-<span class="sourceLineNo">183</span>            regions.put(regionInfo, loc.getServerName());<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>        return true;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    };<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    scanMetaForTableRegions(connection, visitor, tableName);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    return regions;<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>  @InterfaceAudience.Private<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public enum QueryType {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    ALL(HConstants.TABLE_FAMILY, HConstants.CATALOG_FAMILY),<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    REGION(HConstants.CATALOG_FAMILY),<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    TABLE(HConstants.TABLE_FAMILY),<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    REPLICATION(HConstants.REPLICATION_BARRIER_FAMILY);<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>    private final byte[][] families;<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>    QueryType(byte[]... families) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      this.families = families;<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>    byte[][] getFamilies() {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      return this.families;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  }<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span>  /** The delimiter for meta columns for replicaIds &amp;gt; 0 */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  protected static final char META_REPLICA_ID_DELIMITER = '_';<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>  /** A regex for parsing server columns from meta. See above javadoc for meta layout */<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  private static final Pattern SERVER_COLUMN_PATTERN<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    = Pattern.compile("^server(_[0-9a-fA-F]{4})?$");<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>  ////////////////////////<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  // Reading operations //<a name="line.219"></a>
-<span class="sourceLineNo">220</span>  ////////////////////////<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.223"></a>
-<span class="sourceLineNo">224</span>   * @param connection connection we're using<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * @param visitor Visitor invoked against each row in regions family.<a name="line.225"></a>
+<span class="sourceLineNo">146</span>  @VisibleForTesting<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  public static final byte[] REPLICATION_PARENT_QUALIFIER = Bytes.toBytes("parent");<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final byte ESCAPE_BYTE = (byte) 0xFF;<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final byte SEPARATED_BYTE = 0x00;<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  /**<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * Lists all of the table regions currently in META.<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * Deprecated, keep there until some test use this.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   * @param connection what we will use<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   * @param tableName table to list<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   * @return Map of all user-space regions to servers<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   * @deprecated use {@link #getTableRegionsAndLocations}, region can have multiple locations<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   */<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  @Deprecated<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  public static NavigableMap&lt;RegionInfo, ServerName&gt; allTableRegions(<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      Connection connection, final TableName tableName) throws IOException {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    final NavigableMap&lt;RegionInfo, ServerName&gt; regions = new TreeMap&lt;&gt;();<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    Visitor visitor = new TableVisitorBase(tableName) {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      @Override<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      public boolean visitInternal(Result result) throws IOException {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        RegionLocations locations = getRegionLocations(result);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        if (locations == null) return true;<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>          if (loc != null) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>            RegionInfo regionInfo = loc.getRegionInfo();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>            regions.put(regionInfo, loc.getServerName());<a name="line.173"></a>
+<span class="sourceLineNo">174</span>          }<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>        return true;<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      }<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    };<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    scanMetaForTableRegions(connection, visitor, tableName);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    return regions;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>  @InterfaceAudience.Private<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  public enum QueryType {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    ALL(HConstants.TABLE_FAMILY, HConstants.CATALOG_FAMILY),<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    REGION(HConstants.CATALOG_FAMILY),<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    TABLE(HConstants.TABLE_FAMILY),<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    REPLICATION(HConstants.REPLICATION_BARRIER_FAMILY);<a name="line.188"></a>
+<span class="sourceLineNo">189</span><a name="line.189"></a>
+<span class="sourceLineNo">190</span>    private final byte[][] families;<a name="line.190"></a>
+<span class="sourceLineNo">191</span><a name="line.191"></a>
+<span class="sourceLineNo">192</span>    QueryType(byte[]... families) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      this.families = families;<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>    byte[][] getFamilies() {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      return this.families;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  }<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>  /** The delimiter for meta columns for replicaIds &amp;gt; 0 */<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  protected static final char META_REPLICA_ID_DELIMITER = '_';<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>  /** A regex for parsing server columns from meta. See above javadoc for meta layout */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  private static final Pattern SERVER_COLUMN_PATTERN<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    = Pattern.compile("^server(_[0-9a-fA-F]{4})?$");<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>  ////////////////////////<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  // Reading operations //<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  ////////////////////////<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>  /**<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * @param connection connection we're using<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * @param visitor Visitor invoked against each row in regions family.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   */<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  public static void fullScanRegions(Connection connection,<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      final Visitor visitor)<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      throws IOException {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    scanMeta(connection, null, null, QueryType.REGION, visitor);<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>  /**<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   * @param connection connection we're using<a name="line.225"></a>
 <span class="sourceLineNo">226</span>   */<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  public static void fullScanRegions(Connection connection,<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      final Visitor visitor)<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      throws IOException {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    scanMeta(connection, null, null, QueryType.REGION, visitor);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   * @param connection connection we're using<a name="line.235"></a>
+<span class="sourceLineNo">227</span>  public static List&lt;Result&gt; fullScanRegions(Connection connection)<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      throws IOException {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    return fullScan(connection, QueryType.REGION);<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>  /**<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for tables.<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * @param connection connection we're using<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * @param visitor Visitor invoked against each row in tables family.<a name="line.235"></a>
 <span class="sourceLineNo">236</span>   */<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  public static List&lt;Result&gt; fullScanRegions(Connection connection)<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      throws IOException {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    return fullScan(connection, QueryType.REGION);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for tables.<a name="line.243"></a>
-<span class="sourceLineNo">244</span>   * @param connection connection we're using<a name="line.244"></a>
-<span class="sourceLineNo">245</span>   * @param visitor Visitor invoked against each row in tables family.<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   */<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  public static void fullScanTables(Connection connection,<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      final Visitor visitor)<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      throws IOException {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    scanMeta(connection, null, null, QueryType.TABLE, visitor);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt;.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * @param connection connection we're using<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   * @param type scanned part of meta<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * @return List of {@link Result}<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  public static List&lt;Result&gt; fullScan(Connection connection, QueryType type)<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    throws IOException {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    CollectAllVisitor v = new CollectAllVisitor();<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    scanMeta(connection, null, null, type, v);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    return v.getResults();<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>  /**<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * Callers should call close on the returned {@link Table} instance.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * @param connection connection we're using to access Meta<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   * @return An {@link Table} for &lt;code&gt;hbase:meta&lt;/code&gt;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  public static Table getMetaHTable(final Connection connection)<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  throws IOException {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    // We used to pass whole CatalogTracker in here, now we just pass in Connection<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    if (connection == null) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      throw new NullPointerException("No connection");<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    } else if (connection.isClosed()) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      throw new IOException("connection is closed");<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    return connection.getTable(TableName.META_TABLE_NAME);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * @param t Table to use (will be closed when done).<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * @param g Get to run<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   */<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  private static Result get(final Table t, final Get g) throws IOException {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    if (t == null) return null;<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    try {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      return t.get(g);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    } finally {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      t.close();<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  /**<a name="line.295"></a>
-<span class="sourceLineNo">296</span>   * Gets the region info and assignment for the specified region.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   * @param connection connection we're using<a name="line.297"></a>
-<span class="sourceLineNo">298</span>   * @param regionName Region to lookup.<a name="line.298"></a>
-<span class="sourceLineNo">299</span>   * @return Location and RegionInfo for &lt;code&gt;regionName&lt;/code&gt;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * @deprecated use {@link #getRegionLocation(Connection, byte[])} instead<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  @Deprecated<a name="line.302"></a>
-<span class="sourceLineNo">303</span>  public static Pair&lt;RegionInfo, ServerName&gt; getRegion(Connection connection, byte [] regionName)<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    throws IOException {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    HRegionLocation location = getRegionLocation(connection, regionName);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    return location == null<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      ? null<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      : new Pair&lt;&gt;(location.getRegionInfo(), location.getServerName());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  /**<a name="line.311"></a>
-<span class="sourceLineNo">312</span>   * Returns the HRegionLocation from meta for the given region<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * @param connection connection we're using<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   * @param regionName region we're looking for<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   * @return HRegionLocation for the given region<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   */<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  public static HRegionLocation getRegionLocation(Connection connection, byte[] regionName)<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      throws IOException {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    byte[] row = regionName;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    RegionInfo parsedInfo = null;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    try {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      parsedInfo = parseRegionInfoFromRegionName(regionName);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      row = getMetaKeyForRegion(parsedInfo);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    } catch (Exception parseEx) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      // Ignore. This is used with tableName passed as regionName.<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    Get get = new Get(row);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    Result r = get(getMetaHTable(connection), get);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    RegionLocations locations = getRegionLocations(r);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    return locations == null ? null<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      : locations.getRegionLocation(parsedInfo == null ? 0 : parsedInfo.getReplicaId());<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  }<a name="line.333"></a>
-<span class="sourceLineNo">334</span><a name="line.334"></a>
-<span class="sourceLineNo">335</span>  /**<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   * Returns the HRegionLocation from meta for the given region<a name="line.336"></a>
-<span class="sourceLineNo">337</span>   * @param connection connection we're using<a name="line.337"></a>
-<span class="sourceLineNo">338</span>   * @param regionInfo region information<a name="line.338"></a>
-<span class="sourceLineNo">339</span>   * @return HRegionLocation for the given region<a name="line.339"></a>
-<span class="sourceLineNo">340</span>   */<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  public static HRegionLocation getRegionLocation(Connection connection, RegionInfo regionInfo)<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throws IOException {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    byte[] row = getMetaKeyForRegion(regionInfo);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    Get get = new Get(row);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    Result r = get(getMetaHTable(connection), get);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    return getRegionLocation(r, regionInfo, regionInfo.getReplicaId());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  }<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  /** Returns the row key to use for this regionInfo */<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  public static byte[] getMetaKeyForRegion(RegionInfo regionInfo) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    return RegionReplicaUtil.getRegionInfoForDefaultReplica(regionInfo).getRegionName();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  }<a name="line.353"></a>
-<span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>  /** Returns an HRI parsed from this regionName. Not all the fields of the HRI<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * is stored in the name, so the returned object should only be used for the fields<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   * in the regionName.<a name="line.357"></a>
-<span class="sourceLineNo">358</span>   */<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  public static RegionInfo parseRegionInfoFromRegionName(byte[] regionName) throws IOException {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    byte[][] fields = RegionInfo.parseRegionName(regionName);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    long regionId = Long.parseLong(Bytes.toString(fields[2]));<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    int replicaId = fields.length &gt; 3 ? Integer.parseInt(Bytes.toString(fields[3]), 16) : 0;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    return RegionInfoBuilder.newBuilder(TableName.valueOf(fields[0]))<a name="line.363"></a>
-<span class="sourceLineNo">364</span>              .setStartKey(fields[1])<a name="line.364"></a>
-<span class="sourceLineNo">365</span>              .setEndKey(fields[2])<a name="line.365"></a>
-<span class="sourceLineNo">366</span>              .setSplit(false)<a name="line.366"></a>
-<span class="sourceLineNo">367</span>              .setRegionId(regionId)<a name="line.367"></a>
-<span class="sourceLineNo">368</span>              .setReplicaId(replicaId)<a name="line.368"></a>
-<span class="sourceLineNo">369</span>              .build();<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>  /**<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * Gets the result in hbase:meta for the specified region.<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * @param connection connection we're using<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * @param regionName region we're looking for<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * @return result of the specified region<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   */<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public static Result getRegionResult(Connection connection,<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      byte[] regionName) throws IOException {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    Get get = new Get(regionName);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    return get(getMetaHTable(connection), get);<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>   * Get regions from the merge qualifier of the specified merged region<a name="line.386"></a>
-<span class="sourceLineNo">387</span>   * @return null if it doesn't contain merge qualifier, else two merge regions<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   */<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  @Nullable<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  public static Pair&lt;RegionInfo, RegionInfo&gt; getRegionsFromMergeQualifier(<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      Connection connection, byte[] regionName) throws IOException {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Result result = getRegionResult(connection, regionName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    RegionInfo mergeA = getRegionInfo(result, HConstants.MERGEA_QUALIFIER);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    RegionInfo mergeB = getRegionInfo(result, HConstants.MERGEB_QUALIFIER);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    if (mergeA == null &amp;&amp; mergeB == null) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      return null;<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    }<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    return new Pair&lt;&gt;(mergeA, mergeB);<a name="line.398"></a>
-<span class="sourceLineNo">399</span> }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>  /**<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * Checks if the specified table exists.  Looks at the hbase:meta table hosted on<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   * the specified server.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>   * @param connection connection we're using<a name="line.404"></a>
-<span class="sourceLineNo">405</span>   * @param tableName table to check<a name="line.405"></a>
-<span class="sourceLineNo">406</span>   * @return true if the table exists in meta, false if not<a name="line.406"></a>
-<span class="sourceLineNo">407</span>   */<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public static boolean tableExists(Connection connection,<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      final TableName tableName)<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  throws IOException {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // Catalog tables always exist.<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return tableName.equals(TableName.META_TABLE_NAME)<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        || getTableState(connection, tableName) != null;<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>   * Lists all of the regions currently in META.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   *<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   * @param connection to connect with<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   * @param excludeOfflinedSplitParents False if we are to include offlined/splitparents regions,<a name="line.420"></a>
-<span class="sourceLineNo">421</span>   *                                    true and we'll leave out offlined regions from returned list<a name="line.421"></a>
-<span class="sourceLineNo">422</span>   * @return List of all user-space regions.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   */<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  @VisibleForTesting<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  public static List&lt;RegionInfo&gt; getAllRegions(Connection connection,<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      boolean excludeOfflinedSplitParents)<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      throws IOException {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result;<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>    result = getTableRegionsAndLocations(connection, null,<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        excludeOfflinedSplitParents);<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>    return getListOfRegionInfos(result);<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  /**<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * @param connection connection we're using<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * @param tableName table we're looking for<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   */<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName)<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  throws IOException {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return getTableRegions(connection, tableName, false);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  /**<a name="line.449"></a>
-<span class="sourceLineNo">450</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.450"></a>
-<span class="sourceLineNo">451</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * @param connection connection we're using<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   * @param tableName table we're looking for<a name="line.453"></a>
-<span class="sourceLineNo">454</span>   * @param excludeOfflinedSplitParents If true, do not include offlined split<a name="line.454"></a>
-<span class="sourceLineNo">455</span>   * parents in the return.<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   */<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName,<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result =<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      getTableRegionsAndLocations(connection, tableName, excludeOfflinedSplitParents);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    return getListOfRegionInfos(result);<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>  private static List&lt;RegionInfo&gt; getListOfRegionInfos(<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      final List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    if (pairs == null || pairs.isEmpty()) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      return Collections.emptyList();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    List&lt;RegionInfo&gt; result = new ArrayList&lt;&gt;(pairs.size());<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      result.add(pair.getFirst());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    return result;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  }<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>  /**<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * @param tableName table we're working with<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * @return start row for scanning META according to query type<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   */<a name="line.480"></a>
-<span class="sourceLineNo">481</span>  public static byte[] getTableStartRowForMeta(TableName tableName, QueryType type) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    if (tableName == null) {<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      return null;<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    switch (type) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    case REGION:<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      byte[] startRow = new byte[tableName.getName().length + 2];<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      System.arraycopy(tableName.getName(), 0, startRow, 0, tableName.getName().length);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      startRow[startRow.length - 2] = HConstants.DELIMITER;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      startRow[startRow.length - 1] = HConstants.DELIMITER;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      return startRow;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    case ALL:<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    case TABLE:<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    default:<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      return tableName.getName();<a name="line.495"></a>
+<span class="sourceLineNo">237</span>  public static void fullScanTables(Connection connection,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      final Visitor visitor)<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      throws IOException {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    scanMeta(connection, null, null, QueryType.TABLE, visitor);<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>  /**<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt;.<a name="line.244"></a>
+<span class="sourceLineNo">245</span>   * @param connection connection we're using<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   * @param type scanned part of meta<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * @return List of {@link Result}<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   */<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  public static List&lt;Result&gt; fullScan(Connection connection, QueryType type)<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    throws IOException {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    CollectAllVisitor v = new CollectAllVisitor();<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    scanMeta(connection, null, null, type, v);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    return v.getResults();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  /**<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * Callers should call close on the returned {@link Table} instance.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * @param connection connection we're using to access Meta<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * @return An {@link Table} for &lt;code&gt;hbase:meta&lt;/code&gt;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  public static Table getMetaHTable(final Connection connection)<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  throws IOException {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    // We used to pass whole CatalogTracker in here, now we just pass in Connection<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    if (connection == null) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      throw new NullPointerException("No connection");<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    } else if (connection.isClosed()) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      throw new IOException("connection is closed");<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    return connection.getTable(TableName.META_TABLE_NAME);<a name="line.269"></a>
+<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  /**<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * @param t Table to use (will be closed when done).<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   * @param g Get to run<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  private static Result get(final Table t, final Get g) throws IOException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    if (t == null) return null;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    try {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      return t.get(g);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    } finally {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      t.close();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  }<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * Gets the region info and assignment for the specified region.<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * @param connection connection we're using<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * @param regionName Region to lookup.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * @return Location and RegionInfo for &lt;code&gt;regionName&lt;/code&gt;<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * @deprecated use {@link #getRegionLocation(Connection, byte[])} instead<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   */<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  @Deprecated<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  public static Pair&lt;RegionInfo, ServerName&gt; getRegion(Connection connection, byte [] regionName)<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    throws IOException {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    HRegionLocation location = getRegionLocation(connection, regionName);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    return location == null<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      ? null<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      : new Pair&lt;&gt;(location.getRegionInfo(), location.getServerName());<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>  /**<a name="line.301"></a>
+<span class="sourceLineNo">302</span>   * Returns the HRegionLocation from meta for the given region<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * @param connection connection we're using<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * @param regionName region we're looking for<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * @return HRegionLocation for the given region<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   */<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  public static HRegionLocation getRegionLocation(Connection connection, byte[] regionName)<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      throws IOException {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    byte[] row = regionName;<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    RegionInfo parsedInfo = null;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    try {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      parsedInfo = parseRegionInfoFromRegionName(regionName);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      row = getMetaKeyForRegion(parsedInfo);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    } catch (Exception parseEx) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      // Ignore. This is used with tableName passed as regionName.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    Get get = new Get(row);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    Result r = get(getMetaHTable(connection), get);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    RegionLocations locations = getRegionLocations(r);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return locations == null ? null<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      : locations.getRegionLocation(parsedInfo == null ? 0 : parsedInfo.getReplicaId());<a name="line.322"></a>
+<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
+<span class="sourceLineNo">324</span><a name="line.324"></a>
+<span class="sourceLineNo">325</span>  /**<a name="line.325"></a>
+<span class="sourceLineNo">326</span>   * Returns the HRegionLocation from meta for the given region<a name="line.326"></a>
+<span class="sourceLineNo">327</span>   * @param connection connection we're using<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   * @param regionInfo region information<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   * @return HRegionLocation for the given region<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   */<a name="line.330"></a>
+<span class="sourceLineNo">331</span>  public static HRegionLocation getRegionLocation(Connection connection, RegionInfo regionInfo)<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      throws IOException {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    byte[] row = getMetaKeyForRegion(regionInfo);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    Get get = new Get(row);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    Result r = get(getMetaHTable(connection), get);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    return getRegionLocation(r, regionInfo, regionInfo.getReplicaId());<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  }<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  /** Returns the row key to use for this regionInfo */<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  public static byte[] getMetaKeyForRegion(RegionInfo regionInfo) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    return RegionReplicaUtil.getRegionInfoForDefaultReplica(regionInfo).getRegionName();<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  /** Returns an HRI parsed from this regionName. Not all the fields of the HRI<a name="line.345"></a>
+<span class="sourceLineNo">346</span>   * is stored in the name, so the returned object should only be used for the fields<a name="line.346"></a>
+<span class="sourceLineNo">347</span>   * in the regionName.<a name="line.347"></a>
+<span class="sourceLineNo">348</span>   */<a name="line.348"></a>
+<span class="sourceLineNo">349</span>  public static RegionInfo parseRegionInfoFromRegionName(byte[] regionName) throws IOException {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    byte[][] fields = RegionInfo.parseRegionName(regionName);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    long regionId = Long.parseLong(Bytes.toString(fields[2]));<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    int replicaId = fields.length &gt; 3 ? Integer.parseInt(Bytes.toString(fields[3]), 16) : 0;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    return RegionInfoBuilder.newBuilder(TableName.valueOf(fields[0]))<a name="line.353"></a>
+<span class="sourceLineNo">354</span>              .setStartKey(fields[1])<a name="line.354"></a>
+<span class="sourceLineNo">355</span>              .setEndKey(fields[2])<a name="line.355"></a>
+<span class="sourceLineNo">356</span>              .setSplit(false)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>              .setRegionId(regionId)<a name="line.357"></a>
+<span class="sourceLineNo">358</span>              .setReplicaId(replicaId)<a name="line.358"></a>
+<span class="sourceLineNo">359</span>              .build();<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  }<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * Gets the result in hbase:meta for the specified region.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   * @param connection connection we're using<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   * @param regionName region we're looking for<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   * @return result of the specified region<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
+<span class="sourceLineNo">368</span>  public static Result getRegionResult(Connection connection,<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      byte[] regionName) throws IOException {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    Get get = new Get(regionName);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    return get(getMetaHTable(connection), get);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>  }<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>   * Get regions from the merge qualifier of the specified merged region<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * @return null if it doesn't contain merge qualifier, else two merge regions<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   */<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  @Nullable<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  public static Pair&lt;RegionInfo, RegionInfo&gt; getRegionsFromMergeQualifier(<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      Connection connection, byte[] regionName) throws IOException {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    Result result = getRegionResult(connection, regionName);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    RegionInfo mergeA = getRegionInfo(result, HConstants.MERGEA_QUALIFIER);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    RegionInfo mergeB = getRegionInfo(result, HConstants.MERGEB_QUALIFIER);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (mergeA == null &amp;&amp; mergeB == null) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return null;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    return new Pair&lt;&gt;(mergeA, mergeB);<a name="line.388"></a>
+<span class="sourceLineNo">389</span> }<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>   * Checks if the specified table exists.  Looks at the hbase:meta table hosted on<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * the specified server.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * @param connection connection we're using<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @param tableName table to check<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   * @return true if the table exists in meta, false if not<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   */<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  public static boolean tableExists(Connection connection,<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      final TableName tableName)<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  throws IOException {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // Catalog tables always exist.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    return tableName.equals(TableName.META_TABLE_NAME)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || getTableState(connection, tableName) != null;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  /**<a name="line.406"></a>
+<span class="sourceLineNo">407</span>   * Lists all of the regions currently in META.<a name="line.407"></a>
+<span class="sourceLineNo">408</span>   *<a name="line.408"></a>
+<span class="sourceLineNo">409</span>   * @param connection to connect with<a name="line.409"></a>
+<span class="sourceLineNo">410</span>   * @param excludeOfflinedSplitParents False if we are to include offlined/splitparents regions,<a name="line.410"></a>
+<span class="sourceLineNo">411</span>   *                                    true and we'll leave out offlined regions from returned list<a name="line.411"></a>
+<span class="sourceLineNo">412</span>   * @return List of all user-space regions.<a name="line.412"></a>
+<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
+<span class="sourceLineNo">414</span>  @VisibleForTesting<a name="line.414"></a>
+<span class="sourceLineNo">415</span>  public static List&lt;RegionInfo&gt; getAllRegions(Connection connection,<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      boolean excludeOfflinedSplitParents)<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      throws IOException {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result;<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    result = getTableRegionsAndLocations(connection, null,<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        excludeOfflinedSplitParents);<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>    return getListOfRegionInfos(result);<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>  }<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>  /**<a name="line.427"></a>
+<span class="sourceLineNo">428</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.428"></a>
+<span class="sourceLineNo">429</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.429"></a>
+<span class="sourceLineNo">430</span>   * @param connection connection we're using<a name="line.430"></a>
+<span class="sourceLineNo">431</span>   * @param tableName table we're looking for<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName)<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  throws IOException {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    return getTableRegions(connection, tableName, false);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  }<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>   * Gets all of the regions of the specified table. Do not use this method<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   * @param connection connection we're using<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @param tableName table we're looking for<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   * @param excludeOfflinedSplitParents If true, do not include offlined split<a name="line.444"></a>
+<span class="sourceLineNo">445</span>   * parents in the return.<a name="line.445"></a>
+<span class="sourceLineNo">446</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>   */<a name="line.447"></a>
+<span class="sourceLineNo">448</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName,<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result =<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      getTableRegionsAndLocations(connection, tableName, excludeOfflinedSplitParents);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    return getListOfRegionInfos(result);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  private static List&lt;RegionInfo&gt; getListOfRegionInfos(<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      final List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs) {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    if (pairs == null || pairs.isEmpty()) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      return Collections.emptyList();<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    List&lt;RegionInfo&gt; result = new ArrayList&lt;&gt;(pairs.size());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      result.add(pair.getFirst());<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    return result;<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>  /**<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * @param tableName table we're working with<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * @return start row for scanning META according to query type<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   */<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  public static byte[] getTableStartRowForMeta(TableName tableName, QueryType type) {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    if (tableName == null) {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      return null;<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    switch (type) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    case REGION:<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      byte[] startRow = new byte[tableName.getName().length + 2];<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      System.arraycopy(tableName.getName(), 0, startRow, 0, tableName.getName().length);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      startRow[startRow.length - 2] = HConstants.DELIMITER;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      startRow[startRow.length - 1] = HConstants.DELIMITER;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      return startRow;<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    case ALL:<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    case TABLE:<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    default:<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      return tableName.getName();<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    }<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>  /**<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * @param tableName table we're working with<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   * @return stop row for scanning META according to query type<a name="line.491"></a>
+<span class="sourceLineNo">492</span>   */<a name="line.492"></a>
+<span class="sourceLineNo">493</span>  public static byte[] getTableStopRowForMeta(TableName tableName, QueryType type) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    if (tableName == null) {<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return null;<a name="line.495"></a>
 <span class="sourceLineNo">496</span>    }<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>  /**<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   * @param tableName table we're working with<a name="line.500"></a>
-<span class="sourceLineNo">501</span>   * @return stop row for scanning META according to query type<a name="line.501"></a>
-<span class="sourceLineNo">502</span>   */<a name="line.502"></a>
-<span class="sourceLineNo">503</span>  public static byte[] getTableStopRowForMeta(TableName tableName, QueryType type) {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    if (tableName == null) {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      return null;<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    }<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    final byte[] stopRow;<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    switch (type) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    case REGION:<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      stopRow = new byte[tableName.getName().length + 3];<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      System.arraycopy(tableName.getName(), 0, stopRow, 0, tableName.getName().length);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      stopRow[stopRow.length - 3] = ' ';<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      stopRow[stopRow.length - 2] = HConstants.DELIMITER;<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      stopRow[stopRow.length - 1] = HConstants.DELIMITER;<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      break;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    case ALL:<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    case TABLE:<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    default:<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      stopRow = new byte[tableName.getName().length + 1];<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      System.arraycopy(tableName.getName(), 0, stopRow, 0, tableName.getName().length);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      stopRow[stopRow.length - 1] = ' ';<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      break;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    }<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    return stopRow;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * This method creates a Scan object that will only scan catalog rows that<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   * belong to the specified table. It doesn't specify any columns.<a name="line.529"></a>
-<span class="sourceLineNo">530</span>   * This is a better alternative to just using a start row and scan until<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * it hits a new table since that requires parsing the HRI to get the table<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   * name.<a name="line.532"></a>
-<span class="sourceLineNo">533</span>   * @param tableName bytes of table's name<a name="line.533"></a>
-<span class="sourceLineNo">534</span>   * @return configured Scan object<a name="line.534"></a>
-<span class="sourceLineNo">535</span>   */<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  @Deprecated<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  public static Scan getScanForTableName(Connection connection, TableName tableName) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    // Start key is just the table name with delimiters<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    byte[] startKey = getTableStartRowForMeta(tableName, QueryType.REGION);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    // Stop key appends the smallest possible char to the table name<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    byte[] stopKey = getTableStopRowForMeta(tableName, QueryType.REGION);<a name="line.541"></a>
-<span class="sourceLineNo">542</span><a name="line.542"></a>
-<span class="sourceLineNo">543</span>    Scan scan = getMetaScan(connection, -1);<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    scan.setStartRow(startKey);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    scan.setStopRow(stopKey);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    return scan;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>  private static Scan getMetaScan(Connection connection, int rowUpperLimit) {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    Scan scan = new Scan();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    int scannerCaching = connection.getConfiguration()<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        .getInt(HConstants.HBASE_META_SCANNER_CACHING,<a name="line.552"></a>
-<span class="sourceLineNo">553</span>            HConstants.DEFAULT_HBASE_META_SCANNER_CACHING);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    if (connection.getConfiguration().getBoolean(HConstants.USE_META_REPLICAS,<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        HConstants.DEFAULT_USE_META_REPLICAS)) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      scan.setConsistency(Consistency.TIMELINE);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    if (rowUpperLimit &gt; 0) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      scan.setLimit(rowUpperLimit);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      scan.setReadType(Scan.ReadType.PREAD);<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    scan.setCaching(scannerCaching);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    return scan;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  /**<a name="line.565"></a>
-<span class="sourceLineNo">566</span>   * Do not use this method to get meta table regions, use methods in MetaTableLocator instead.<a name="line.566"></a>
-<span class="sourceLineNo">567</span>   * @param connection connection we're using<a name="line.567"></a>
-<span class="sourceLineNo">568</span>   * @param tableName table we're looking for<a name="line.568"></a>
-<span class="sourceLineNo">569</span>   * @return Return list of regioninfos and server.<a name="line.569"></a>
-<span class="sourceLineNo">570</span>   * @throws IOException<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   */<a name="line.571"></a>
-<span class="sourceLineNo">572</span>  public static List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    getTableRegionsAndLocations(Connection connection, TableName tableName)<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      throws IOException {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    return getTableRegionsAndLocations(connection, tableName, true);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>  }<a name="line.576"></a>
-<span class="sourceLineNo">577</span><a name="line.577"></a>
-<span class="sourceLineNo">578</span>  /**<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   * Do not use this method to get meta table regions, use methods in MetaTableLocator instead.<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param connection connection we're using<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param tableName table to work with, can be null for getting all regions<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @param excludeOfflinedSplitParents don't return split parents<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   * @return Return list of regioninfos and server addresses.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   * @throws IOException<a name="line.584"></a>
-<span class="sourceLineNo">585</span>   */<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  public static List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; getTableRegionsAndLocations(<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      Connection connection, @Nullable final TableName tableName,<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    if (tableName != null &amp;&amp; tableName.equals(TableName.META_TABLE_NAME)) {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      throw new IOException("This method can't be used to locate meta regions;"<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        + " use MetaTableLocator instead");<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    }<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    // Make a version of CollectingVisitor that collects RegionInfo and ServerAddress<a name="line.593"></a>
-<span class="sourceLineNo">594</span>    CollectingVisitor&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; visitor =<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      new CollectingVisitor&lt;Pair&lt;RegionInfo, ServerName&gt;&gt;() {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>        private RegionLocations current = null;<a name="line.596"></a>
-<span class="sourceLineNo">597</span><a name="line.597"></a>
-<span class="sourceLineNo">598</span>        @Override<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        public boolean visit(Result r) throws IOException {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>          current = getRegionLocations(r);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          if (current == null || current.getRegionLocation().getRegion() == null) {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>            LOG.warn("No serialized RegionInfo in " + r);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>            return true;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>          }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          RegionInfo hri = current.getRegionLocation().getRegion();<a name="line.605"></a>
-<span class="sourceLineNo">606</span>          if (excludeOfflinedSplitParents &amp;&amp; hri.isSplitParent()) return true;<a name="line.606"></a>
-<span class="sourceLineNo">607</span>          // Else call super and add this Result to the collection.<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          return super.visit(r);<a name="line.608"></a>
-<span class="sourceLineNo">609</span>        }<a name="line.609"></a>
-<span class="sourceLineNo">610</span><a name="line.610"></a>
-<span class="sourceLineNo">611</span>        @Override<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        void add(Result r) {<a name="line.612"></a>
-<span class="sourceLineNo">613</span>          if (current == null) {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>            return;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>          }<a name="line.615"></a>
-<span class="sourceLineNo">616</span>          for (HRegionLocation loc : current.getRegionLocations()) {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>            if (loc != null) {<a name="line.617"></a>
-<span class="sourceLineNo">618</span>              this.results.add(new Pair&lt;&gt;(loc.getRegion(), loc.getServerName()));<a name="line.618"></a>
-<span class="sourceLineNo">619</span>            }<a name="line.619"></a>
-<span class="sourceLineNo">620</span>          }<a name="line.620"></a>
-<span class="sourceLineNo">621</span>        }<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      };<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    scanMeta(connection,<a name="line.623"></a>
-<span class="sourceLineNo">624</span>        getTableStartRowForMeta(tableName, QueryType.REGION),<a name="line.624"></a>
-<span class="sourceLineNo">625</span>        getTableStopRowForMeta(tableName, QueryType.REGION),<a name="line.625"></a>
-<span class="sourceLineNo">626</span>        QueryType.REGION, visitor);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    return visitor.getResults();<a name="line.627"></a>
-<span class="sourceLineNo">628</span>  }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>  /**<a name="line.630"></a>
-<span class="sourceLineNo">631</span>   * @param connection connection we're using<a name="line.631"></a>
-<span class="sourceLineNo">632</span>   * @param serverName server whose regions we're interested in<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * @return List of user regions installed on this server (does not include<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * catalog regions).<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   * @throws IOException<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   */<a name="line.636"></a>
-<span class="sourceLineNo">637</span>  public static NavigableMap&lt;RegionInfo, Result&gt;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>  getServerUserRegions(Connection connection, final ServerName serverName)<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    throws IOException {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    final NavigableMap&lt;RegionInfo, Result&gt; hris = new TreeMap&lt;&gt;();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    // Fill the above hris map with entries from hbase:meta that have the passed<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    // servername.<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    CollectingVisitor&lt;Result&gt; v = new CollectingVisitor&lt;Result&gt;() {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      @Override<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      void add(Result r) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        if (r == null || r.isEmpty()) return;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        RegionLocations locations = getRegionLocations(r);<a name="line.647"></a>
-<span class="sourceLineNo">648</span>        if (locations == null) return;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>          if (loc != null) {<a name="line.650"></a>
-<span class="sourceLineNo">651</span>            if (loc.getServerName() != null &amp;&amp; loc.getServerName().equals(serverName)) {<a name="line.651"></a>
-<span class="sourceLineNo">652</span>              hris.put(loc.getRegion(), r);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>            }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>          }<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    };<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    scanMeta(connection, null, null, QueryType.REGION, v);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    return hris;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>  }<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  public static void fullScanMetaAndPrint(Connection connection)<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    throws IOException {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    Visitor v = new Visitor() {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      @Override<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      public boolean visit(Result r) throws IOException {<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        if (r ==  null || r.isEmpty()) return true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        LOG.info("fullScanMetaAndPrint.Current Meta Row: " + r);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        TableState state = getTableState(r);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (state != null) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          LOG.info("Table State: " + state);<a name="line.671"></a>
-<span class="sourceLineNo">672</span>        } else {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>          RegionLocations locations = getRegionLocations(r);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>          if (locations == null) return true;<a name="line.674"></a>
-<span class="sourceLineNo">675</span>          for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.675"></a>
-<span class="sourceLineNo">676</span>            if (loc != null) {<a name="line.676"></a>
-<span class="sourceLineNo">677</span>              LOG.info("fullScanMetaAndPrint.HRI Print= " + loc.getRegion());<a name="line.677"></a>
-<span class="sourceLineNo">678</span>            }<a name="line.678"></a>
-<span class="sourceLineNo">679</span>          }<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        }<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        return true;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      }<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    };<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    scanMeta(connection, null, null, QueryType.ALL, v);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  }<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>  public static void scanMetaForTableRegions(Connection connection, Visitor visitor,<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      TableName tableName) throws IOException {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    scanMeta(connection, tableName, QueryType.REGION, Integer.MAX_VALUE, visitor);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>  }<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>  public static void scanMeta(Connection connection, TableName table, QueryType type, int maxRows,<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      final Visitor visitor) throws IOException {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    scanMeta(connection, getTableStartRowForMeta(table, type), getTableStopRowForMeta(table, type),<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      type, maxRows, visitor);<a name="li

<TRUNCATED>

[33/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 87ba170..6be1f69 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/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/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/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/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/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/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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 ecfaabf..1a43271 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
@@ -254,9 +254,9 @@
 <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/IntegrationTestWithCellVisibilityLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestWithCellVisibilityLoadAndVerify.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/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/IntegrationTestWithCellVisibilityLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestWithCellVisibilityLoadAndVerify.Counters</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 f7d6df6..4edd3f8 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -140,8 +140,8 @@
 <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/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/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>
 </ul>
 </li>
 </ul>


[34/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 28a2264..c2b39f0 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.1956">PerformanceEvaluation.SequentialWriteTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2056">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>
@@ -220,7 +220,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Buffe
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result
 :A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hb
 ase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1957">SequentialWriteTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html#line.2057">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.1962">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html#line.2062">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/f2065178/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 487dc94..5a0a45c 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.1288">PerformanceEvaluation.TableTest</a>
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1355">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>
@@ -220,7 +220,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testRow-int-">testRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/a
 pache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testRow-int-">testRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="
 ../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1289">table</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.client.Table <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html#line.1356">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.1291">TableTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html#line.1358">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.1296">onStartup</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html#line.1363">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.1301">onTakedown</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html#line.1368">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/f2065178/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 47d323f..8d630a4 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.1238">PerformanceEvaluation.Test</a>
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1305">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>
@@ -201,7 +201,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestB
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#onStartup--">onStartup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#onTakedown--">onTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testRow-int-">testRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateV
 alueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#onStartup--">onStartup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#onTakedown--">onTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testRow-int-">testRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateS
 canMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1239">connection</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.client.Connection <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html#line.1306">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.1241">Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html#line.1308">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.1247">createConnection</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html#line.1314">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.1254">closeConnection</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html#line.1321">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/f2065178/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 2d1a68a..b2dfe84 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":6,"i1":6,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":9,"i12":6,"i13":6,"i14":10,"i15":6,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10};
+var methods = {"i0":6,"i1":6,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":9,"i12":6,"i13":6,"i14":10,"i15":6,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -138,6 +138,14 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <th class="colLast" scope="col">Field and Description</th>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>private com.codahale.metrics.Histogram</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#bytesInRemoteResultsHistogram">bytesInRemoteResultsHistogram</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private com.codahale.metrics.Histogram</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#bytesInResultsHistogram">bytesInResultsHistogram</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>protected org.apache.hadoop.conf.Configuration</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#conf">conf</a></span></code>&nbsp;</td>
 </tr>
@@ -150,21 +158,37 @@ 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.TestBase.html#latencyHistogram">latencyHistogram</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>private com.codahale.metrics.Histogram</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#millisBetweenNextHistogram">millisBetweenNextHistogram</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>protected <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#opts">opts</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected <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></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#rand">rand</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static <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></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#randomSeed">randomSeed</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private org.apache.hadoop.hbase.trace.SpanReceiverHost</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#receiverHost">receiverHost</a></span></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>private com.codahale.metrics.Histogram</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#regionsScannedHistogram">regionsScannedHistogram</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private com.codahale.metrics.Histogram</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#remoteRpcCallsHistogram">remoteRpcCallsHistogram</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private com.codahale.metrics.Histogram</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#rpcCallsHistogram">rpcCallsHistogram</a></span></code>&nbsp;</td>
+</tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#status">status</a></span></code>&nbsp;</td>
@@ -306,14 +330,18 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </tr>
 <tr id="i19" class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a></span>(int&nbsp;valueSize)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a></span>(org.apache.hadoop.hbase.client.metrics.ScanMetrics&nbsp;metrics)</code>&nbsp;</td>
 </tr>
 <tr id="i20" class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a></span>(org.apache.hadoop.hbase.client.Result&nbsp;r)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a></span>(int&nbsp;valueSize)</code>&nbsp;</td>
 </tr>
 <tr id="i21" class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a></span>(org.apache.hadoop.hbase.client.Result&nbsp;r)</code>&nbsp;</td>
+</tr>
+<tr id="i22" class="altColor">
+<td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></span>(org.apache.hadoop.hbase.client.Result[]&nbsp;rs)</code>&nbsp;</td>
 </tr>
 </table>
@@ -437,13 +465,67 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1049">valueSizeHistogram</a></pre>
 </li>
 </ul>
+<a name="rpcCallsHistogram">
+<!--   -->
+</a>
+<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.1050">rpcCallsHistogram</a></pre>
+</li>
+</ul>
+<a name="remoteRpcCallsHistogram">
+<!--   -->
+</a>
+<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.1051">remoteRpcCallsHistogram</a></pre>
+</li>
+</ul>
+<a name="millisBetweenNextHistogram">
+<!--   -->
+</a>
+<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.1052">millisBetweenNextHistogram</a></pre>
+</li>
+</ul>
+<a name="regionsScannedHistogram">
+<!--   -->
+</a>
+<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.1053">regionsScannedHistogram</a></pre>
+</li>
+</ul>
+<a name="bytesInResultsHistogram">
+<!--   -->
+</a>
+<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.1054">bytesInResultsHistogram</a></pre>
+</li>
+</ul>
+<a name="bytesInRemoteResultsHistogram">
+<!--   -->
+</a>
+<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.1055">bytesInRemoteResultsHistogram</a></pre>
+</li>
+</ul>
 <a name="zipf">
 <!--   -->
 </a>
 <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.1050">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.1056">zipf</a></pre>
 </li>
 </ul>
 </li>
@@ -460,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.1056">TestBase</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1062">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
@@ -490,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.1077">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.1083">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-">
@@ -499,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.1087">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.1093">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>
@@ -513,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.1092">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.1098">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>
@@ -527,7 +609,16 @@ 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.1101">updateValueSize</a>(int&nbsp;valueSize)</pre>
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1107">updateValueSize</a>(int&nbsp;valueSize)</pre>
+</li>
+</ul>
+<a name="updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>updateScanMetrics</h4>
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1112">updateScanMetrics</a>(org.apache.hadoop.hbase.client.metrics.ScanMetrics&nbsp;metrics)</pre>
 </li>
 </ul>
 <a name="generateStatus-int-int-int-">
@@ -536,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.1106">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.1140">generateStatus</a>(int&nbsp;sr,
                       int&nbsp;i,
                       int&nbsp;lr)</pre>
 </li>
@@ -547,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.1111">isRandomValueSize</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1145">isRandomValueSize</a>()</pre>
 </li>
 </ul>
 <a name="getReportingPeriod--">
@@ -556,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.1115">getReportingPeriod</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1149">getReportingPeriod</a>()</pre>
 </li>
 </ul>
 <a name="getLatencyHistogram--">
@@ -565,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.1122">getLatencyHistogram</a>()</pre>
+<pre>public&nbsp;com.codahale.metrics.Histogram&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1156">getLatencyHistogram</a>()</pre>
 <div class="block">Populated by testTakedown. Only implemented by RandomReadTest at the moment.</div>
 </li>
 </ul>
@@ -575,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.1126">testSetup</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1160">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>
@@ -589,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.1133">createConnection</a>()
+<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1176">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>
@@ -603,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.1135">onStartup</a>()
+<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1178">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>
@@ -617,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.1137">testTakedown</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1180">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>
@@ -631,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.1157">onTakedown</a>()
+<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1224">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>
@@ -645,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.1159">closeConnection</a>()
+<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1226">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>
@@ -659,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.1166">test</a>()
+<pre>long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1233">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>
@@ -675,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.1178">getStartRow</a>()</pre>
+<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1245">getStartRow</a>()</pre>
 </li>
 </ul>
 <a name="getLastRow--">
@@ -684,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.1182">getLastRow</a>()</pre>
+<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1249">getLastRow</a>()</pre>
 </li>
 </ul>
 <a name="testTimed--">
@@ -693,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.1189">testTimed</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1256">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>
@@ -710,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.1220">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.1287">getShortLatencyReport</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Subset of the histograms' calculation.</dd>
@@ -723,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.1227">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.1294">getShortValueSizeReport</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Subset of the histograms' calculation.</dd>
@@ -736,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.1235">testRow</a>(int&nbsp;i)
+<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1302">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/f2065178/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 39c2acf..5487092 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.html
@@ -119,7 +119,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.LimitedPrivate(value="Tools")
-public class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.130">PerformanceEvaluation</a>
+public class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.131">PerformanceEvaluation</a>
 extends org.apache.hadoop.conf.Configured
 implements org.apache.hadoop.util.Tool</pre>
 <div class="block">Script used evaluating HBase performance and scalability.  Runs a HBase
@@ -386,26 +386,22 @@ implements org.apache.hadoop.util.Tool</pre>
 <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">
-<td class="colFirst"><code>static byte[]</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.html#QUALIFIER_NAME">QUALIFIER_NAME</a></span></code>&nbsp;</td>
-</tr>
-<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="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_SEEK_SCAN">RANDOM_SEEK_SCAN</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <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="rowColor">
+<tr class="altColor">
 <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="altColor">
+<tr class="rowColor">
 <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>
@@ -623,7 +619,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>RANDOM_SEEK_SCAN</h4>
-<pre>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.131">RANDOM_SEEK_SCAN</a></pre>
+<pre>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.132">RANDOM_SEEK_SCAN</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.PerformanceEvaluation.RANDOM_SEEK_SCAN">Constant Field Values</a></dd>
@@ -636,7 +632,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>RANDOM_READ</h4>
-<pre>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.132">RANDOM_READ</a></pre>
+<pre>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.133">RANDOM_READ</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.PerformanceEvaluation.RANDOM_READ">Constant Field Values</a></dd>
@@ -649,7 +645,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.133">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.134">LOG</a></pre>
 </li>
 </ul>
 <a name="MAPPER">
@@ -658,7 +654,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>MAPPER</h4>
-<pre>private static final&nbsp;com.fasterxml.jackson.databind.ObjectMapper <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.134">MAPPER</a></pre>
+<pre>private static final&nbsp;com.fasterxml.jackson.databind.ObjectMapper <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.135">MAPPER</a></pre>
 </li>
 </ul>
 <a name="TABLE_NAME">
@@ -667,7 +663,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>TABLE_NAME</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.139">TABLE_NAME</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.html#line.140">TABLE_NAME</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.PerformanceEvaluation.TABLE_NAME">Constant Field Values</a></dd>
@@ -680,7 +676,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <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.140">FAMILY_NAME</a></pre>
+<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.141">FAMILY_NAME</a></pre>
 </li>
 </ul>
 <a name="COLUMN_ZERO">
@@ -689,16 +685,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.141">COLUMN_ZERO</a></pre>
-</li>
-</ul>
-<a name="QUALIFIER_NAME">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>QUALIFIER_NAME</h4>
-<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.142">QUALIFIER_NAME</a></pre>
+<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.142">COLUMN_ZERO</a></pre>
 </li>
 </ul>
 <a name="DEFAULT_VALUE_LENGTH">
@@ -990,7 +977,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <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.2043">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.2150">calculateMbps</a>(int&nbsp;rows,
                                     long&nbsp;timeMs,
                                     int&nbsp;valueSize,
                                     int&nbsp;columns)</pre>
@@ -1010,7 +997,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.2058">format</a>(int&nbsp;number)</pre>
+<pre>public static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2165">format</a>(int&nbsp;number)</pre>
 </li>
 </ul>
 <a name="generateData-java.util.Random-int-">
@@ -1019,7 +1006,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.2074">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.2181">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>
@@ -1029,7 +1016,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.2096">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.2203">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>
@@ -1039,7 +1026,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.2100">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.2207">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>
@@ -1049,7 +1036,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.2104">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.2211">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,
@@ -1070,7 +1057,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.2142">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.2249">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-">
@@ -1079,7 +1066,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.2146">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.2253">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>,
@@ -1100,7 +1087,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.2168">printUsage</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2275">printUsage</a>()</pre>
 </li>
 </ul>
 <a name="printUsage-java.lang.String-">
@@ -1109,7 +1096,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.2172">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.2279">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-">
@@ -1118,7 +1105,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.2176">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.2283">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>
@@ -1128,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.2181">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.2288">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>
@@ -1138,7 +1125,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.2286">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.2393">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
@@ -1151,7 +1138,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.2553">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.2660">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-">
@@ -1160,7 +1147,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.2571">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.2678">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-">
@@ -1169,7 +1156,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.2576">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.2683">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>
@@ -1185,7 +1172,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.2621">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.2728">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-">
@@ -1194,7 +1181,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.2625">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.2732">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-">
@@ -1203,7 +1190,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.2630">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.2737">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/f2065178/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 ec56445..4837d80 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/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>
+<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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 33d7e86..04e7385 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -569,15 +569,15 @@
 <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.<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/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/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/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/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/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/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/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/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/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/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/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.Service</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index fbff915..b5bacb6 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -206,8 +206,8 @@
 <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.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestYieldProcedures.TestStateMachineProcedure.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.TestSMProcedureState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestStateMachineProcedure.TestSMProcedureState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureRecovery.TestStateMachineProcedure.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.TestSMProcedureState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestStateMachineProcedure.TestSMProcedureState</span></a></li>
 </ul>
 </li>
 </ul>


[32/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      if (this.testS

<TRUNCATED>

[49/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/checkstyle.rss
----------------------------------------------------------------------
diff --git a/checkstyle.rss b/checkstyle.rss
index e6f25dd..62c7425 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: 15864,
+             Errors: 15865,
              Warnings: 0,
              Infos: 0
       </title>
@@ -4605,7 +4605,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  30
+                  31
                 </td>
               </tr>
                           <tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index d4ae2af..c8ad6c7 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index 78ca6ef..bf02801 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index 05ba8a3..5f2f21f 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index 19f0fec..703c94f 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index ad19247..59ef175 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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-04</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-05</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index 5f72784..b81f234 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3768,21 +3768,21 @@
 <!--   -->
 </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>"Fri May  4 14:39:10 UTC 2018"</code></td>
+<td class="colLast"><code>"Sat May  5 14:43:16 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>"87f5b5f3411d96c31b4cb61b9a57ced22be91d1f"</code></td>
+<td class="colLast"><code>"acd0d1e446c164d9c54bfb461b2d449c8d717c07"</code></td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.srcChecksum">
 <!--   -->
 </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#srcChecksum">srcChecksum</a></code></td>
-<td class="colLast"><code>"9cfe3eb8d49902aafbb6d8066c40fb45"</code></td>
+<td class="colLast"><code>"ad489a437d1ef798b4c0329dd68b451a"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.url">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 261b2e0..8f2fb17 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -71799,8 +71799,6 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/RSGroupTableAccessor.html#META_QUALIFIER_BYTES">META_QUALIFIER_BYTES</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/RSGroupTableAccessor.html" title="class in org.apache.hadoop.hbase">RSGroupTableAccessor</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/MetaTableAccessor.html#META_REGION_PREFIX">META_REGION_PREFIX</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/MetaTableAccessor.html" title="class in org.apache.hadoop.hbase">MetaTableAccessor</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/AssignmentManager.html#META_REGION_SET">META_REGION_SET</a></span> - Static variable in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/AsyncMetaTableAccessor.html#META_REPLICA_ID_DELIMITER">META_REPLICA_ID_DELIMITER</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/AsyncMetaTableAccessor.html" title="class in org.apache.hadoop.hbase">AsyncMetaTableAccessor</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.CloseableVisitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.CloseableVisitor.html b/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.CloseableVisitor.html
index 0e8cfed..fc2fba7 100644
--- a/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.CloseableVisitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.CloseableVisitor.html
@@ -103,7 +103,7 @@
 </dl>
 <hr>
 <br>
-<pre>public static interface <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1162">MetaTableAccessor.CloseableVisitor</a>
+<pre>public static interface <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1152">MetaTableAccessor.CloseableVisitor</a>
 extends <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html" title="interface in org.apache.hadoop.hbase">MetaTableAccessor.Visitor</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.html?is-external=true" title="class or interface in java.io">Closeable</a></pre>
 <div class="block">Implementations 'visit' a catalog table row but with close() at the end.</div>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.CollectAllVisitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.CollectAllVisitor.html b/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.CollectAllVisitor.html
index 7e34bd0..eb3878c 100644
--- a/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.CollectAllVisitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.CollectAllVisitor.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1192">MetaTableAccessor.CollectAllVisitor</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1182">MetaTableAccessor.CollectAllVisitor</a>
 extends <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html" title="class in org.apache.hadoop.hbase">MetaTableAccessor.CollectingVisitor</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&gt;</pre>
 <div class="block">Collects all returned.</div>
 </li>
@@ -214,7 +214,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Collectin
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CollectAllVisitor</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectAllVisitor.html#line.1192">CollectAllVisitor</a>()</pre>
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectAllVisitor.html#line.1182">CollectAllVisitor</a>()</pre>
 </li>
 </ul>
 </li>
@@ -231,7 +231,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Collectin
 <ul class="blockListLast">
 <li class="blockList">
 <h4>add</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectAllVisitor.html#line.1194">add</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;r)</pre>
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectAllVisitor.html#line.1184">add</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;r)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html#add-org.apache.hadoop.hbase.client.Result-">add</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html" title="class in org.apache.hadoop.hbase">MetaTableAccessor.CollectingVisitor</a>&lt;<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&gt;</code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html b/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html
index 54b6221..5efdbc4 100644
--- a/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html
@@ -121,7 +121,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1168">MetaTableAccessor.CollectingVisitor</a>&lt;T&gt;
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1158">MetaTableAccessor.CollectingVisitor</a>&lt;T&gt;
 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="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html" title="interface in org.apache.hadoop.hbase">MetaTableAccessor.Visitor</a></pre>
 <div class="block">A <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html" title="interface in org.apache.hadoop.hbase"><code>MetaTableAccessor.Visitor</code></a> that collects content out of passed <a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client"><code>Result</code></a>.</div>
@@ -221,7 +221,7 @@ implements <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Visito
 <ul class="blockListLast">
 <li class="blockList">
 <h4>results</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html" title="type parameter in MetaTableAccessor.CollectingVisitor">T</a>&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html#line.1169">results</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html" title="type parameter in MetaTableAccessor.CollectingVisitor">T</a>&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html#line.1159">results</a></pre>
 </li>
 </ul>
 </li>
@@ -238,7 +238,7 @@ implements <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Visito
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CollectingVisitor</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html#line.1168">CollectingVisitor</a>()</pre>
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html#line.1158">CollectingVisitor</a>()</pre>
 </li>
 </ul>
 </li>
@@ -255,7 +255,7 @@ implements <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Visito
 <ul class="blockList">
 <li class="blockList">
 <h4>visit</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html#line.1171">visit</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;r)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html#line.1161">visit</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&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>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html#visit-org.apache.hadoop.hbase.client.Result-">MetaTableAccessor.Visitor</a></code></span></div>
 <div class="block">Visit the catalog table row.</div>
@@ -278,7 +278,7 @@ implements <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Visito
 <ul class="blockList">
 <li class="blockList">
 <h4>add</h4>
-<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html#line.1178">add</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;r)</pre>
+<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html#line.1168">add</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;r)</pre>
 </li>
 </ul>
 <a name="getResults--">
@@ -287,7 +287,7 @@ implements <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Visito
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getResults</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html" title="type parameter in MetaTableAccessor.CollectingVisitor">T</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html#line.1184">getResults</a>()</pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html" title="type parameter in MetaTableAccessor.CollectingVisitor">T</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html#line.1174">getResults</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Collected results; wait till visits complete to collect all

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.DefaultVisitorBase.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.DefaultVisitorBase.html b/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.DefaultVisitorBase.html
index 362a869..226a829 100644
--- a/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.DefaultVisitorBase.html
+++ b/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.DefaultVisitorBase.html
@@ -121,7 +121,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1202">MetaTableAccessor.DefaultVisitorBase</a>
+<pre>public abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1192">MetaTableAccessor.DefaultVisitorBase</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="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html" title="interface in org.apache.hadoop.hbase">MetaTableAccessor.Visitor</a></pre>
 <div class="block">A Visitor that skips offline regions and split parents</div>
@@ -198,7 +198,7 @@ implements <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Visito
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DefaultVisitorBase</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.DefaultVisitorBase.html#line.1204">DefaultVisitorBase</a>()</pre>
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.DefaultVisitorBase.html#line.1194">DefaultVisitorBase</a>()</pre>
 </li>
 </ul>
 </li>
@@ -215,7 +215,7 @@ implements <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Visito
 <ul class="blockList">
 <li class="blockList">
 <h4>visitInternal</h4>
-<pre>public abstract&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.DefaultVisitorBase.html#line.1208">visitInternal</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;rowResult)
+<pre>public abstract&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.DefaultVisitorBase.html#line.1198">visitInternal</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;rowResult)
                                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>
@@ -229,7 +229,7 @@ implements <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Visito
 <ul class="blockListLast">
 <li class="blockList">
 <h4>visit</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.DefaultVisitorBase.html#line.1211">visit</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;rowResult)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.DefaultVisitorBase.html#line.1201">visit</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;rowResult)
               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"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html#visit-org.apache.hadoop.hbase.client.Result-">MetaTableAccessor.Visitor</a></code></span></div>
 <div class="block">Visit the catalog table row.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html b/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html
index 0b896e8..cb7f42e 100644
--- a/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html
+++ b/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html
@@ -123,7 +123,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public static enum <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.194">MetaTableAccessor.QueryType</a>
+public static enum <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.184">MetaTableAccessor.QueryType</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/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase">MetaTableAccessor.QueryType</a>&gt;</pre>
 </li>
 </ul>
@@ -240,7 +240,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>ALL</h4>
-<pre>public static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase">MetaTableAccessor.QueryType</a> <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html#line.195">ALL</a></pre>
+<pre>public static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase">MetaTableAccessor.QueryType</a> <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html#line.185">ALL</a></pre>
 </li>
 </ul>
 <a name="REGION">
@@ -249,7 +249,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>REGION</h4>
-<pre>public static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase">MetaTableAccessor.QueryType</a> <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html#line.196">REGION</a></pre>
+<pre>public static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase">MetaTableAccessor.QueryType</a> <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html#line.186">REGION</a></pre>
 </li>
 </ul>
 <a name="TABLE">
@@ -258,7 +258,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>TABLE</h4>
-<pre>public static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase">MetaTableAccessor.QueryType</a> <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html#line.197">TABLE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase">MetaTableAccessor.QueryType</a> <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html#line.187">TABLE</a></pre>
 </li>
 </ul>
 <a name="REPLICATION">
@@ -267,7 +267,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>REPLICATION</h4>
-<pre>public static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase">MetaTableAccessor.QueryType</a> <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html#line.198">REPLICATION</a></pre>
+<pre>public static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase">MetaTableAccessor.QueryType</a> <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html#line.188">REPLICATION</a></pre>
 </li>
 </ul>
 </li>
@@ -284,7 +284,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>families</h4>
-<pre>private final&nbsp;byte[][] <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html#line.200">families</a></pre>
+<pre>private final&nbsp;byte[][] <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html#line.190">families</a></pre>
 </li>
 </ul>
 </li>
@@ -301,7 +301,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/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase">MetaTableAccessor.QueryType</a>[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html#line.194">values</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase">MetaTableAccessor.QueryType</a>[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html#line.184">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:
@@ -321,7 +321,7 @@ for (MetaTableAccessor.QueryType c : MetaTableAccessor.QueryType.values())
 <ul class="blockList">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase">MetaTableAccessor.QueryType</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html#line.194">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/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase">MetaTableAccessor.QueryType</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html#line.184">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 
@@ -343,7 +343,7 @@ not permitted.)</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getFamilies</h4>
-<pre>byte[][]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html#line.206">getFamilies</a>()</pre>
+<pre>byte[][]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html#line.196">getFamilies</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html b/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html
index 6b5ff43..3d89242 100644
--- a/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html
+++ b/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static final class <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.2022">MetaTableAccessor.ReplicationBarrierResult</a>
+<pre>public static final class <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.2012">MetaTableAccessor.ReplicationBarrierResult</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>
@@ -223,7 +223,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>barriers</h4>
-<pre>private final&nbsp;long[] <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html#line.2023">barriers</a></pre>
+<pre>private final&nbsp;long[] <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html#line.2013">barriers</a></pre>
 </li>
 </ul>
 <a name="state">
@@ -232,7 +232,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>state</h4>
-<pre>private final&nbsp;<a href="../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a> <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html#line.2024">state</a></pre>
+<pre>private final&nbsp;<a href="../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a> <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html#line.2014">state</a></pre>
 </li>
 </ul>
 <a name="parentRegionNames">
@@ -241,7 +241,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>parentRegionNames</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;byte[]&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html#line.2025">parentRegionNames</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;byte[]&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html#line.2015">parentRegionNames</a></pre>
 </li>
 </ul>
 </li>
@@ -258,7 +258,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ReplicationBarrierResult</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html#line.2027">ReplicationBarrierResult</a>(long[]&nbsp;barriers,
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html#line.2017">ReplicationBarrierResult</a>(long[]&nbsp;barriers,
                                 <a href="../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>&nbsp;state,
                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;byte[]&gt;&nbsp;parentRegionNames)</pre>
 </li>
@@ -277,7 +277,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getBarriers</h4>
-<pre>public&nbsp;long[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html#line.2033">getBarriers</a>()</pre>
+<pre>public&nbsp;long[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html#line.2023">getBarriers</a>()</pre>
 </li>
 </ul>
 <a name="getState--">
@@ -286,7 +286,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getState</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html#line.2037">getState</a>()</pre>
+<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html#line.2027">getState</a>()</pre>
 </li>
 </ul>
 <a name="getParentRegionNames--">
@@ -295,7 +295,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getParentRegionNames</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html#line.2041">getParentRegionNames</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html#line.2031">getParentRegionNames</a>()</pre>
 </li>
 </ul>
 <a name="toString--">
@@ -304,7 +304,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <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/MetaTableAccessor.ReplicationBarrierResult.html#line.2046">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/MetaTableAccessor.ReplicationBarrierResult.html#line.2036">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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.TableVisitorBase.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.TableVisitorBase.html b/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.TableVisitorBase.html
index c4c7c76..b9b8282 100644
--- a/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.TableVisitorBase.html
+++ b/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.TableVisitorBase.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1231">MetaTableAccessor.TableVisitorBase</a>
+<pre>public abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1221">MetaTableAccessor.TableVisitorBase</a>
 extends <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.DefaultVisitorBase.html" title="class in org.apache.hadoop.hbase">MetaTableAccessor.DefaultVisitorBase</a></pre>
 <div class="block">A Visitor for a table. Provides a consistent view of the table's
  hbase:meta entries during concurrent splits (see HBASE-5986 for details). This class
@@ -223,7 +223,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.DefaultVi
 <ul class="blockListLast">
 <li class="blockList">
 <h4>tableName</h4>
-<pre>private&nbsp;<a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.TableVisitorBase.html#line.1232">tableName</a></pre>
+<pre>private&nbsp;<a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.TableVisitorBase.html#line.1222">tableName</a></pre>
 </li>
 </ul>
 </li>
@@ -240,7 +240,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.DefaultVi
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TableVisitorBase</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.TableVisitorBase.html#line.1234">TableVisitorBase</a>(<a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.TableVisitorBase.html#line.1224">TableVisitorBase</a>(<a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</pre>
 </li>
 </ul>
 </li>
@@ -257,7 +257,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.DefaultVi
 <ul class="blockListLast">
 <li class="blockList">
 <h4>visit</h4>
-<pre>public final&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.TableVisitorBase.html#line.1240">visit</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;rowResult)
+<pre>public final&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.TableVisitorBase.html#line.1230">visit</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;rowResult)
                     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"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html#visit-org.apache.hadoop.hbase.client.Result-">MetaTableAccessor.Visitor</a></code></span></div>
 <div class="block">Visit the catalog table row.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html b/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html
index 1f22ff0..5d8f8d1 100644
--- a/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static interface <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1149">MetaTableAccessor.Visitor</a></pre>
+<pre>public static interface <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1139">MetaTableAccessor.Visitor</a></pre>
 <div class="block">Implementations 'visit' a catalog table row.</div>
 </li>
 </ul>
@@ -160,7 +160,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockListLast">
 <li class="blockList">
 <h4>visit</h4>
-<pre>boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html#line.1156">visit</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;r)
+<pre>boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html#line.1146">visit</a>(<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&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>
 <div class="block">Visit the catalog table row.</div>
 <dl>


[22/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span class="sourc

<TRUNCATED>

[11/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a n

<TRUNCATED>

[13/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOExcep

<TRUNCATED>

[31/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span class="

<TRUNCATED>

[44/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html
index cdd2f36..fea2b5a 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html
@@ -151,2029 +151,2019 @@
 <span class="sourceLineNo">143</span>  private static final Logger LOG = LoggerFactory.getLogger(MetaTableAccessor.class);<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  private static final Logger METALOG = LoggerFactory.getLogger("org.apache.hadoop.hbase.META");<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final byte[] META_REGION_PREFIX;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  static {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    // Copy the prefix from FIRST_META_REGIONINFO into META_REGION_PREFIX.<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    // FIRST_META_REGIONINFO == 'hbase:meta,,1'.  META_REGION_PREFIX == 'hbase:meta,'<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    int len = RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName().length - 2;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    META_REGION_PREFIX = new byte [len];<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    System.arraycopy(RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName(), 0,<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      META_REGION_PREFIX, 0, len);<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>  @VisibleForTesting<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  public static final byte[] REPLICATION_PARENT_QUALIFIER = Bytes.toBytes("parent");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private static final byte ESCAPE_BYTE = (byte) 0xFF;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  private static final byte SEPARATED_BYTE = 0x00;<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>  /**<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * Lists all of the table regions currently in META.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   * Deprecated, keep there until some test use this.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @param connection what we will use<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * @param tableName table to list<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * @return Map of all user-space regions to servers<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   * @deprecated use {@link #getTableRegionsAndLocations}, region can have multiple locations<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  @Deprecated<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  public static NavigableMap&lt;RegionInfo, ServerName&gt; allTableRegions(<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      Connection connection, final TableName tableName) throws IOException {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    final NavigableMap&lt;RegionInfo, ServerName&gt; regions = new TreeMap&lt;&gt;();<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    Visitor visitor = new TableVisitorBase(tableName) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      @Override<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      public boolean visitInternal(Result result) throws IOException {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>        RegionLocations locations = getRegionLocations(result);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        if (locations == null) return true;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>          if (loc != null) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>            RegionInfo regionInfo = loc.getRegionInfo();<a name="line.182"></a>
-<span class="sourceLineNo">183</span>            regions.put(regionInfo, loc.getServerName());<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>        return true;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    };<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    scanMetaForTableRegions(connection, visitor, tableName);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    return regions;<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>  @InterfaceAudience.Private<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public enum QueryType {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    ALL(HConstants.TABLE_FAMILY, HConstants.CATALOG_FAMILY),<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    REGION(HConstants.CATALOG_FAMILY),<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    TABLE(HConstants.TABLE_FAMILY),<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    REPLICATION(HConstants.REPLICATION_BARRIER_FAMILY);<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>    private final byte[][] families;<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>    QueryType(byte[]... families) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      this.families = families;<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>    byte[][] getFamilies() {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      return this.families;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  }<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span>  /** The delimiter for meta columns for replicaIds &amp;gt; 0 */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  protected static final char META_REPLICA_ID_DELIMITER = '_';<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>  /** A regex for parsing server columns from meta. See above javadoc for meta layout */<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  private static final Pattern SERVER_COLUMN_PATTERN<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    = Pattern.compile("^server(_[0-9a-fA-F]{4})?$");<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>  ////////////////////////<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  // Reading operations //<a name="line.219"></a>
-<span class="sourceLineNo">220</span>  ////////////////////////<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.223"></a>
-<span class="sourceLineNo">224</span>   * @param connection connection we're using<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * @param visitor Visitor invoked against each row in regions family.<a name="line.225"></a>
+<span class="sourceLineNo">146</span>  @VisibleForTesting<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  public static final byte[] REPLICATION_PARENT_QUALIFIER = Bytes.toBytes("parent");<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final byte ESCAPE_BYTE = (byte) 0xFF;<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final byte SEPARATED_BYTE = 0x00;<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  /**<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * Lists all of the table regions currently in META.<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * Deprecated, keep there until some test use this.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   * @param connection what we will use<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   * @param tableName table to list<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   * @return Map of all user-space regions to servers<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   * @deprecated use {@link #getTableRegionsAndLocations}, region can have multiple locations<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   */<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  @Deprecated<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  public static NavigableMap&lt;RegionInfo, ServerName&gt; allTableRegions(<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      Connection connection, final TableName tableName) throws IOException {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    final NavigableMap&lt;RegionInfo, ServerName&gt; regions = new TreeMap&lt;&gt;();<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    Visitor visitor = new TableVisitorBase(tableName) {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      @Override<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      public boolean visitInternal(Result result) throws IOException {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        RegionLocations locations = getRegionLocations(result);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        if (locations == null) return true;<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>          if (loc != null) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>            RegionInfo regionInfo = loc.getRegionInfo();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>            regions.put(regionInfo, loc.getServerName());<a name="line.173"></a>
+<span class="sourceLineNo">174</span>          }<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>        return true;<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      }<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    };<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    scanMetaForTableRegions(connection, visitor, tableName);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    return regions;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>  @InterfaceAudience.Private<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  public enum QueryType {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    ALL(HConstants.TABLE_FAMILY, HConstants.CATALOG_FAMILY),<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    REGION(HConstants.CATALOG_FAMILY),<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    TABLE(HConstants.TABLE_FAMILY),<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    REPLICATION(HConstants.REPLICATION_BARRIER_FAMILY);<a name="line.188"></a>
+<span class="sourceLineNo">189</span><a name="line.189"></a>
+<span class="sourceLineNo">190</span>    private final byte[][] families;<a name="line.190"></a>
+<span class="sourceLineNo">191</span><a name="line.191"></a>
+<span class="sourceLineNo">192</span>    QueryType(byte[]... families) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      this.families = families;<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>    byte[][] getFamilies() {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      return this.families;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  }<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>  /** The delimiter for meta columns for replicaIds &amp;gt; 0 */<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  protected static final char META_REPLICA_ID_DELIMITER = '_';<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>  /** A regex for parsing server columns from meta. See above javadoc for meta layout */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  private static final Pattern SERVER_COLUMN_PATTERN<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    = Pattern.compile("^server(_[0-9a-fA-F]{4})?$");<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>  ////////////////////////<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  // Reading operations //<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  ////////////////////////<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>  /**<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * @param connection connection we're using<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * @param visitor Visitor invoked against each row in regions family.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   */<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  public static void fullScanRegions(Connection connection,<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      final Visitor visitor)<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      throws IOException {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    scanMeta(connection, null, null, QueryType.REGION, visitor);<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>  /**<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   * @param connection connection we're using<a name="line.225"></a>
 <span class="sourceLineNo">226</span>   */<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  public static void fullScanRegions(Connection connection,<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      final Visitor visitor)<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      throws IOException {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    scanMeta(connection, null, null, QueryType.REGION, visitor);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   * @param connection connection we're using<a name="line.235"></a>
+<span class="sourceLineNo">227</span>  public static List&lt;Result&gt; fullScanRegions(Connection connection)<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      throws IOException {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    return fullScan(connection, QueryType.REGION);<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>  /**<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for tables.<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * @param connection connection we're using<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * @param visitor Visitor invoked against each row in tables family.<a name="line.235"></a>
 <span class="sourceLineNo">236</span>   */<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  public static List&lt;Result&gt; fullScanRegions(Connection connection)<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      throws IOException {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    return fullScan(connection, QueryType.REGION);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for tables.<a name="line.243"></a>
-<span class="sourceLineNo">244</span>   * @param connection connection we're using<a name="line.244"></a>
-<span class="sourceLineNo">245</span>   * @param visitor Visitor invoked against each row in tables family.<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   */<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  public static void fullScanTables(Connection connection,<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      final Visitor visitor)<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      throws IOException {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    scanMeta(connection, null, null, QueryType.TABLE, visitor);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt;.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * @param connection connection we're using<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   * @param type scanned part of meta<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * @return List of {@link Result}<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  public static List&lt;Result&gt; fullScan(Connection connection, QueryType type)<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    throws IOException {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    CollectAllVisitor v = new CollectAllVisitor();<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    scanMeta(connection, null, null, type, v);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    return v.getResults();<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>  /**<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * Callers should call close on the returned {@link Table} instance.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * @param connection connection we're using to access Meta<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   * @return An {@link Table} for &lt;code&gt;hbase:meta&lt;/code&gt;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  public static Table getMetaHTable(final Connection connection)<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  throws IOException {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    // We used to pass whole CatalogTracker in here, now we just pass in Connection<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    if (connection == null) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      throw new NullPointerException("No connection");<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    } else if (connection.isClosed()) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      throw new IOException("connection is closed");<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    return connection.getTable(TableName.META_TABLE_NAME);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * @param t Table to use (will be closed when done).<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * @param g Get to run<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   */<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  private static Result get(final Table t, final Get g) throws IOException {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    if (t == null) return null;<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    try {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      return t.get(g);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    } finally {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      t.close();<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  /**<a name="line.295"></a>
-<span class="sourceLineNo">296</span>   * Gets the region info and assignment for the specified region.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   * @param connection connection we're using<a name="line.297"></a>
-<span class="sourceLineNo">298</span>   * @param regionName Region to lookup.<a name="line.298"></a>
-<span class="sourceLineNo">299</span>   * @return Location and RegionInfo for &lt;code&gt;regionName&lt;/code&gt;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * @deprecated use {@link #getRegionLocation(Connection, byte[])} instead<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  @Deprecated<a name="line.302"></a>
-<span class="sourceLineNo">303</span>  public static Pair&lt;RegionInfo, ServerName&gt; getRegion(Connection connection, byte [] regionName)<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    throws IOException {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    HRegionLocation location = getRegionLocation(connection, regionName);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    return location == null<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      ? null<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      : new Pair&lt;&gt;(location.getRegionInfo(), location.getServerName());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  /**<a name="line.311"></a>
-<span class="sourceLineNo">312</span>   * Returns the HRegionLocation from meta for the given region<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * @param connection connection we're using<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   * @param regionName region we're looking for<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   * @return HRegionLocation for the given region<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   */<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  public static HRegionLocation getRegionLocation(Connection connection, byte[] regionName)<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      throws IOException {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    byte[] row = regionName;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    RegionInfo parsedInfo = null;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    try {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      parsedInfo = parseRegionInfoFromRegionName(regionName);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      row = getMetaKeyForRegion(parsedInfo);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    } catch (Exception parseEx) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      // Ignore. This is used with tableName passed as regionName.<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    Get get = new Get(row);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    Result r = get(getMetaHTable(connection), get);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    RegionLocations locations = getRegionLocations(r);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    return locations == null ? null<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      : locations.getRegionLocation(parsedInfo == null ? 0 : parsedInfo.getReplicaId());<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  }<a name="line.333"></a>
-<span class="sourceLineNo">334</span><a name="line.334"></a>
-<span class="sourceLineNo">335</span>  /**<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   * Returns the HRegionLocation from meta for the given region<a name="line.336"></a>
-<span class="sourceLineNo">337</span>   * @param connection connection we're using<a name="line.337"></a>
-<span class="sourceLineNo">338</span>   * @param regionInfo region information<a name="line.338"></a>
-<span class="sourceLineNo">339</span>   * @return HRegionLocation for the given region<a name="line.339"></a>
-<span class="sourceLineNo">340</span>   */<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  public static HRegionLocation getRegionLocation(Connection connection, RegionInfo regionInfo)<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throws IOException {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    byte[] row = getMetaKeyForRegion(regionInfo);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    Get get = new Get(row);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    Result r = get(getMetaHTable(connection), get);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    return getRegionLocation(r, regionInfo, regionInfo.getReplicaId());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  }<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  /** Returns the row key to use for this regionInfo */<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  public static byte[] getMetaKeyForRegion(RegionInfo regionInfo) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    return RegionReplicaUtil.getRegionInfoForDefaultReplica(regionInfo).getRegionName();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  }<a name="line.353"></a>
-<span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>  /** Returns an HRI parsed from this regionName. Not all the fields of the HRI<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * is stored in the name, so the returned object should only be used for the fields<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   * in the regionName.<a name="line.357"></a>
-<span class="sourceLineNo">358</span>   */<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  public static RegionInfo parseRegionInfoFromRegionName(byte[] regionName) throws IOException {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    byte[][] fields = RegionInfo.parseRegionName(regionName);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    long regionId = Long.parseLong(Bytes.toString(fields[2]));<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    int replicaId = fields.length &gt; 3 ? Integer.parseInt(Bytes.toString(fields[3]), 16) : 0;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    return RegionInfoBuilder.newBuilder(TableName.valueOf(fields[0]))<a name="line.363"></a>
-<span class="sourceLineNo">364</span>              .setStartKey(fields[1])<a name="line.364"></a>
-<span class="sourceLineNo">365</span>              .setEndKey(fields[2])<a name="line.365"></a>
-<span class="sourceLineNo">366</span>              .setSplit(false)<a name="line.366"></a>
-<span class="sourceLineNo">367</span>              .setRegionId(regionId)<a name="line.367"></a>
-<span class="sourceLineNo">368</span>              .setReplicaId(replicaId)<a name="line.368"></a>
-<span class="sourceLineNo">369</span>              .build();<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>  /**<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * Gets the result in hbase:meta for the specified region.<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * @param connection connection we're using<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * @param regionName region we're looking for<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * @return result of the specified region<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   */<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public static Result getRegionResult(Connection connection,<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      byte[] regionName) throws IOException {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    Get get = new Get(regionName);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    return get(getMetaHTable(connection), get);<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>   * Get regions from the merge qualifier of the specified merged region<a name="line.386"></a>
-<span class="sourceLineNo">387</span>   * @return null if it doesn't contain merge qualifier, else two merge regions<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   */<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  @Nullable<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  public static Pair&lt;RegionInfo, RegionInfo&gt; getRegionsFromMergeQualifier(<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      Connection connection, byte[] regionName) throws IOException {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Result result = getRegionResult(connection, regionName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    RegionInfo mergeA = getRegionInfo(result, HConstants.MERGEA_QUALIFIER);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    RegionInfo mergeB = getRegionInfo(result, HConstants.MERGEB_QUALIFIER);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    if (mergeA == null &amp;&amp; mergeB == null) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      return null;<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    }<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    return new Pair&lt;&gt;(mergeA, mergeB);<a name="line.398"></a>
-<span class="sourceLineNo">399</span> }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>  /**<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * Checks if the specified table exists.  Looks at the hbase:meta table hosted on<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   * the specified server.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>   * @param connection connection we're using<a name="line.404"></a>
-<span class="sourceLineNo">405</span>   * @param tableName table to check<a name="line.405"></a>
-<span class="sourceLineNo">406</span>   * @return true if the table exists in meta, false if not<a name="line.406"></a>
-<span class="sourceLineNo">407</span>   */<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public static boolean tableExists(Connection connection,<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      final TableName tableName)<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  throws IOException {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // Catalog tables always exist.<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return tableName.equals(TableName.META_TABLE_NAME)<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        || getTableState(connection, tableName) != null;<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>   * Lists all of the regions currently in META.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   *<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   * @param connection to connect with<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   * @param excludeOfflinedSplitParents False if we are to include offlined/splitparents regions,<a name="line.420"></a>
-<span class="sourceLineNo">421</span>   *                                    true and we'll leave out offlined regions from returned list<a name="line.421"></a>
-<span class="sourceLineNo">422</span>   * @return List of all user-space regions.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   */<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  @VisibleForTesting<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  public static List&lt;RegionInfo&gt; getAllRegions(Connection connection,<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      boolean excludeOfflinedSplitParents)<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      throws IOException {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result;<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>    result = getTableRegionsAndLocations(connection, null,<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        excludeOfflinedSplitParents);<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>    return getListOfRegionInfos(result);<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  /**<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * @param connection connection we're using<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * @param tableName table we're looking for<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   */<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName)<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  throws IOException {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return getTableRegions(connection, tableName, false);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  /**<a name="line.449"></a>
-<span class="sourceLineNo">450</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.450"></a>
-<span class="sourceLineNo">451</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * @param connection connection we're using<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   * @param tableName table we're looking for<a name="line.453"></a>
-<span class="sourceLineNo">454</span>   * @param excludeOfflinedSplitParents If true, do not include offlined split<a name="line.454"></a>
-<span class="sourceLineNo">455</span>   * parents in the return.<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   */<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName,<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result =<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      getTableRegionsAndLocations(connection, tableName, excludeOfflinedSplitParents);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    return getListOfRegionInfos(result);<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>  private static List&lt;RegionInfo&gt; getListOfRegionInfos(<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      final List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    if (pairs == null || pairs.isEmpty()) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      return Collections.emptyList();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    List&lt;RegionInfo&gt; result = new ArrayList&lt;&gt;(pairs.size());<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      result.add(pair.getFirst());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    return result;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  }<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>  /**<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * @param tableName table we're working with<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * @return start row for scanning META according to query type<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   */<a name="line.480"></a>
-<span class="sourceLineNo">481</span>  public static byte[] getTableStartRowForMeta(TableName tableName, QueryType type) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    if (tableName == null) {<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      return null;<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    switch (type) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    case REGION:<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      byte[] startRow = new byte[tableName.getName().length + 2];<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      System.arraycopy(tableName.getName(), 0, startRow, 0, tableName.getName().length);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      startRow[startRow.length - 2] = HConstants.DELIMITER;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      startRow[startRow.length - 1] = HConstants.DELIMITER;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      return startRow;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    case ALL:<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    case TABLE:<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    default:<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      return tableName.getName();<a name="line.495"></a>
+<span class="sourceLineNo">237</span>  public static void fullScanTables(Connection connection,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      final Visitor visitor)<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      throws IOException {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    scanMeta(connection, null, null, QueryType.TABLE, visitor);<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>  /**<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt;.<a name="line.244"></a>
+<span class="sourceLineNo">245</span>   * @param connection connection we're using<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   * @param type scanned part of meta<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * @return List of {@link Result}<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   */<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  public static List&lt;Result&gt; fullScan(Connection connection, QueryType type)<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    throws IOException {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    CollectAllVisitor v = new CollectAllVisitor();<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    scanMeta(connection, null, null, type, v);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    return v.getResults();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  /**<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * Callers should call close on the returned {@link Table} instance.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * @param connection connection we're using to access Meta<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * @return An {@link Table} for &lt;code&gt;hbase:meta&lt;/code&gt;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  public static Table getMetaHTable(final Connection connection)<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  throws IOException {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    // We used to pass whole CatalogTracker in here, now we just pass in Connection<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    if (connection == null) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      throw new NullPointerException("No connection");<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    } else if (connection.isClosed()) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      throw new IOException("connection is closed");<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    return connection.getTable(TableName.META_TABLE_NAME);<a name="line.269"></a>
+<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  /**<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * @param t Table to use (will be closed when done).<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   * @param g Get to run<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  private static Result get(final Table t, final Get g) throws IOException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    if (t == null) return null;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    try {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      return t.get(g);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    } finally {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      t.close();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  }<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * Gets the region info and assignment for the specified region.<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * @param connection connection we're using<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * @param regionName Region to lookup.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * @return Location and RegionInfo for &lt;code&gt;regionName&lt;/code&gt;<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * @deprecated use {@link #getRegionLocation(Connection, byte[])} instead<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   */<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  @Deprecated<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  public static Pair&lt;RegionInfo, ServerName&gt; getRegion(Connection connection, byte [] regionName)<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    throws IOException {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    HRegionLocation location = getRegionLocation(connection, regionName);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    return location == null<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      ? null<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      : new Pair&lt;&gt;(location.getRegionInfo(), location.getServerName());<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>  /**<a name="line.301"></a>
+<span class="sourceLineNo">302</span>   * Returns the HRegionLocation from meta for the given region<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * @param connection connection we're using<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * @param regionName region we're looking for<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * @return HRegionLocation for the given region<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   */<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  public static HRegionLocation getRegionLocation(Connection connection, byte[] regionName)<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      throws IOException {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    byte[] row = regionName;<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    RegionInfo parsedInfo = null;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    try {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      parsedInfo = parseRegionInfoFromRegionName(regionName);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      row = getMetaKeyForRegion(parsedInfo);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    } catch (Exception parseEx) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      // Ignore. This is used with tableName passed as regionName.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    Get get = new Get(row);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    Result r = get(getMetaHTable(connection), get);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    RegionLocations locations = getRegionLocations(r);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return locations == null ? null<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      : locations.getRegionLocation(parsedInfo == null ? 0 : parsedInfo.getReplicaId());<a name="line.322"></a>
+<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
+<span class="sourceLineNo">324</span><a name="line.324"></a>
+<span class="sourceLineNo">325</span>  /**<a name="line.325"></a>
+<span class="sourceLineNo">326</span>   * Returns the HRegionLocation from meta for the given region<a name="line.326"></a>
+<span class="sourceLineNo">327</span>   * @param connection connection we're using<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   * @param regionInfo region information<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   * @return HRegionLocation for the given region<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   */<a name="line.330"></a>
+<span class="sourceLineNo">331</span>  public static HRegionLocation getRegionLocation(Connection connection, RegionInfo regionInfo)<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      throws IOException {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    byte[] row = getMetaKeyForRegion(regionInfo);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    Get get = new Get(row);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    Result r = get(getMetaHTable(connection), get);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    return getRegionLocation(r, regionInfo, regionInfo.getReplicaId());<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  }<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  /** Returns the row key to use for this regionInfo */<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  public static byte[] getMetaKeyForRegion(RegionInfo regionInfo) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    return RegionReplicaUtil.getRegionInfoForDefaultReplica(regionInfo).getRegionName();<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  /** Returns an HRI parsed from this regionName. Not all the fields of the HRI<a name="line.345"></a>
+<span class="sourceLineNo">346</span>   * is stored in the name, so the returned object should only be used for the fields<a name="line.346"></a>
+<span class="sourceLineNo">347</span>   * in the regionName.<a name="line.347"></a>
+<span class="sourceLineNo">348</span>   */<a name="line.348"></a>
+<span class="sourceLineNo">349</span>  public static RegionInfo parseRegionInfoFromRegionName(byte[] regionName) throws IOException {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    byte[][] fields = RegionInfo.parseRegionName(regionName);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    long regionId = Long.parseLong(Bytes.toString(fields[2]));<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    int replicaId = fields.length &gt; 3 ? Integer.parseInt(Bytes.toString(fields[3]), 16) : 0;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    return RegionInfoBuilder.newBuilder(TableName.valueOf(fields[0]))<a name="line.353"></a>
+<span class="sourceLineNo">354</span>              .setStartKey(fields[1])<a name="line.354"></a>
+<span class="sourceLineNo">355</span>              .setEndKey(fields[2])<a name="line.355"></a>
+<span class="sourceLineNo">356</span>              .setSplit(false)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>              .setRegionId(regionId)<a name="line.357"></a>
+<span class="sourceLineNo">358</span>              .setReplicaId(replicaId)<a name="line.358"></a>
+<span class="sourceLineNo">359</span>              .build();<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  }<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * Gets the result in hbase:meta for the specified region.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   * @param connection connection we're using<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   * @param regionName region we're looking for<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   * @return result of the specified region<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
+<span class="sourceLineNo">368</span>  public static Result getRegionResult(Connection connection,<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      byte[] regionName) throws IOException {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    Get get = new Get(regionName);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    return get(getMetaHTable(connection), get);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>  }<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>   * Get regions from the merge qualifier of the specified merged region<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * @return null if it doesn't contain merge qualifier, else two merge regions<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   */<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  @Nullable<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  public static Pair&lt;RegionInfo, RegionInfo&gt; getRegionsFromMergeQualifier(<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      Connection connection, byte[] regionName) throws IOException {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    Result result = getRegionResult(connection, regionName);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    RegionInfo mergeA = getRegionInfo(result, HConstants.MERGEA_QUALIFIER);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    RegionInfo mergeB = getRegionInfo(result, HConstants.MERGEB_QUALIFIER);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (mergeA == null &amp;&amp; mergeB == null) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return null;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    return new Pair&lt;&gt;(mergeA, mergeB);<a name="line.388"></a>
+<span class="sourceLineNo">389</span> }<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>   * Checks if the specified table exists.  Looks at the hbase:meta table hosted on<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * the specified server.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * @param connection connection we're using<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @param tableName table to check<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   * @return true if the table exists in meta, false if not<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   */<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  public static boolean tableExists(Connection connection,<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      final TableName tableName)<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  throws IOException {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // Catalog tables always exist.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    return tableName.equals(TableName.META_TABLE_NAME)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || getTableState(connection, tableName) != null;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  /**<a name="line.406"></a>
+<span class="sourceLineNo">407</span>   * Lists all of the regions currently in META.<a name="line.407"></a>
+<span class="sourceLineNo">408</span>   *<a name="line.408"></a>
+<span class="sourceLineNo">409</span>   * @param connection to connect with<a name="line.409"></a>
+<span class="sourceLineNo">410</span>   * @param excludeOfflinedSplitParents False if we are to include offlined/splitparents regions,<a name="line.410"></a>
+<span class="sourceLineNo">411</span>   *                                    true and we'll leave out offlined regions from returned list<a name="line.411"></a>
+<span class="sourceLineNo">412</span>   * @return List of all user-space regions.<a name="line.412"></a>
+<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
+<span class="sourceLineNo">414</span>  @VisibleForTesting<a name="line.414"></a>
+<span class="sourceLineNo">415</span>  public static List&lt;RegionInfo&gt; getAllRegions(Connection connection,<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      boolean excludeOfflinedSplitParents)<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      throws IOException {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result;<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    result = getTableRegionsAndLocations(connection, null,<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        excludeOfflinedSplitParents);<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>    return getListOfRegionInfos(result);<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>  }<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>  /**<a name="line.427"></a>
+<span class="sourceLineNo">428</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.428"></a>
+<span class="sourceLineNo">429</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.429"></a>
+<span class="sourceLineNo">430</span>   * @param connection connection we're using<a name="line.430"></a>
+<span class="sourceLineNo">431</span>   * @param tableName table we're looking for<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName)<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  throws IOException {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    return getTableRegions(connection, tableName, false);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  }<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>   * Gets all of the regions of the specified table. Do not use this method<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   * @param connection connection we're using<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @param tableName table we're looking for<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   * @param excludeOfflinedSplitParents If true, do not include offlined split<a name="line.444"></a>
+<span class="sourceLineNo">445</span>   * parents in the return.<a name="line.445"></a>
+<span class="sourceLineNo">446</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>   */<a name="line.447"></a>
+<span class="sourceLineNo">448</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName,<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result =<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      getTableRegionsAndLocations(connection, tableName, excludeOfflinedSplitParents);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    return getListOfRegionInfos(result);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  private static List&lt;RegionInfo&gt; getListOfRegionInfos(<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      final List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs) {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    if (pairs == null || pairs.isEmpty()) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      return Collections.emptyList();<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    List&lt;RegionInfo&gt; result = new ArrayList&lt;&gt;(pairs.size());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      result.add(pair.getFirst());<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    return result;<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>  /**<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * @param tableName table we're working with<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * @return start row for scanning META according to query type<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   */<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  public static byte[] getTableStartRowForMeta(TableName tableName, QueryType type) {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    if (tableName == null) {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      return null;<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    switch (type) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    case REGION:<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      byte[] startRow = new byte[tableName.getName().length + 2];<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      System.arraycopy(tableName.getName(), 0, startRow, 0, tableName.getName().length);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      startRow[startRow.length - 2] = HConstants.DELIMITER;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      startRow[startRow.length - 1] = HConstants.DELIMITER;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      return startRow;<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    case ALL:<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    case TABLE:<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    default:<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      return tableName.getName();<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    }<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>  /**<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * @param tableName table we're working with<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   * @return stop row for scanning META according to query type<a name="line.491"></a>
+<span class="sourceLineNo">492</span>   */<a name="line.492"></a>
+<span class="sourceLineNo">493</span>  public static byte[] getTableStopRowForMeta(TableName tableName, QueryType type) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    if (tableName == null) {<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return null;<a name="line.495"></a>
 <span class="sourceLineNo">496</span>    }<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>  /**<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   * @param tableName table we're working with<a name="line.500"></a>
-<span class="sourceLineNo">501</span>   * @return stop row for scanning META according to query type<a name="line.501"></a>
-<span class="sourceLineNo">502</span>   */<a name="line.502"></a>
-<span class="sourceLineNo">503</span>  public static byte[] getTableStopRowForMeta(TableName tableName, QueryType type) {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    if (tableName == null) {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      return null;<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    }<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    final byte[] stopRow;<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    switch (type) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    case REGION:<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      stopRow = new byte[tableName.getName().length + 3];<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      System.arraycopy(tableName.getName(), 0, stopRow, 0, tableName.getName().length);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      stopRow[stopRow.length - 3] = ' ';<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      stopRow[stopRow.length - 2] = HConstants.DELIMITER;<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      stopRow[stopRow.length - 1] = HConstants.DELIMITER;<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      break;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    case ALL:<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    case TABLE:<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    default:<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      stopRow = new byte[tableName.getName().length + 1];<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      System.arraycopy(tableName.getName(), 0, stopRow, 0, tableName.getName().length);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      stopRow[stopRow.length - 1] = ' ';<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      break;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    }<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    return stopRow;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * This method creates a Scan object that will only scan catalog rows that<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   * belong to the specified table. It doesn't specify any columns.<a name="line.529"></a>
-<span class="sourceLineNo">530</span>   * This is a better alternative to just using a start row and scan until<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * it hits a new table since that requires parsing the HRI to get the table<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   * name.<a name="line.532"></a>
-<span class="sourceLineNo">533</span>   * @param tableName bytes of table's name<a name="line.533"></a>
-<span class="sourceLineNo">534</span>   * @return configured Scan object<a name="line.534"></a>
-<span class="sourceLineNo">535</span>   */<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  @Deprecated<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  public static Scan getScanForTableName(Connection connection, TableName tableName) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    // Start key is just the table name with delimiters<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    byte[] startKey = getTableStartRowForMeta(tableName, QueryType.REGION);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    // Stop key appends the smallest possible char to the table name<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    byte[] stopKey = getTableStopRowForMeta(tableName, QueryType.REGION);<a name="line.541"></a>
-<span class="sourceLineNo">542</span><a name="line.542"></a>
-<span class="sourceLineNo">543</span>    Scan scan = getMetaScan(connection, -1);<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    scan.setStartRow(startKey);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    scan.setStopRow(stopKey);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    return scan;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>  private static Scan getMetaScan(Connection connection, int rowUpperLimit) {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    Scan scan = new Scan();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    int scannerCaching = connection.getConfiguration()<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        .getInt(HConstants.HBASE_META_SCANNER_CACHING,<a name="line.552"></a>
-<span class="sourceLineNo">553</span>            HConstants.DEFAULT_HBASE_META_SCANNER_CACHING);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    if (connection.getConfiguration().getBoolean(HConstants.USE_META_REPLICAS,<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        HConstants.DEFAULT_USE_META_REPLICAS)) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      scan.setConsistency(Consistency.TIMELINE);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    if (rowUpperLimit &gt; 0) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      scan.setLimit(rowUpperLimit);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      scan.setReadType(Scan.ReadType.PREAD);<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    scan.setCaching(scannerCaching);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    return scan;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  /**<a name="line.565"></a>
-<span class="sourceLineNo">566</span>   * Do not use this method to get meta table regions, use methods in MetaTableLocator instead.<a name="line.566"></a>
-<span class="sourceLineNo">567</span>   * @param connection connection we're using<a name="line.567"></a>
-<span class="sourceLineNo">568</span>   * @param tableName table we're looking for<a name="line.568"></a>
-<span class="sourceLineNo">569</span>   * @return Return list of regioninfos and server.<a name="line.569"></a>
-<span class="sourceLineNo">570</span>   * @throws IOException<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   */<a name="line.571"></a>
-<span class="sourceLineNo">572</span>  public static List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    getTableRegionsAndLocations(Connection connection, TableName tableName)<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      throws IOException {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    return getTableRegionsAndLocations(connection, tableName, true);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>  }<a name="line.576"></a>
-<span class="sourceLineNo">577</span><a name="line.577"></a>
-<span class="sourceLineNo">578</span>  /**<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   * Do not use this method to get meta table regions, use methods in MetaTableLocator instead.<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param connection connection we're using<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param tableName table to work with, can be null for getting all regions<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @param excludeOfflinedSplitParents don't return split parents<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   * @return Return list of regioninfos and server addresses.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   * @throws IOException<a name="line.584"></a>
-<span class="sourceLineNo">585</span>   */<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  public static List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; getTableRegionsAndLocations(<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      Connection connection, @Nullable final TableName tableName,<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    if (tableName != null &amp;&amp; tableName.equals(TableName.META_TABLE_NAME)) {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      throw new IOException("This method can't be used to locate meta regions;"<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        + " use MetaTableLocator instead");<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    }<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    // Make a version of CollectingVisitor that collects RegionInfo and ServerAddress<a name="line.593"></a>
-<span class="sourceLineNo">594</span>    CollectingVisitor&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; visitor =<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      new CollectingVisitor&lt;Pair&lt;RegionInfo, ServerName&gt;&gt;() {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>        private RegionLocations current = null;<a name="line.596"></a>
-<span class="sourceLineNo">597</span><a name="line.597"></a>
-<span class="sourceLineNo">598</span>        @Override<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        public boolean visit(Result r) throws IOException {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>          current = getRegionLocations(r);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          if (current == null || current.getRegionLocation().getRegion() == null) {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>            LOG.warn("No serialized RegionInfo in " + r);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>            return true;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>          }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          RegionInfo hri = current.getRegionLocation().getRegion();<a name="line.605"></a>
-<span class="sourceLineNo">606</span>          if (excludeOfflinedSplitParents &amp;&amp; hri.isSplitParent()) return true;<a name="line.606"></a>
-<span class="sourceLineNo">607</span>          // Else call super and add this Result to the collection.<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          return super.visit(r);<a name="line.608"></a>
-<span class="sourceLineNo">609</span>        }<a name="line.609"></a>
-<span class="sourceLineNo">610</span><a name="line.610"></a>
-<span class="sourceLineNo">611</span>        @Override<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        void add(Result r) {<a name="line.612"></a>
-<span class="sourceLineNo">613</span>          if (current == null) {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>            return;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>          }<a name="line.615"></a>
-<span class="sourceLineNo">616</span>          for (HRegionLocation loc : current.getRegionLocations()) {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>            if (loc != null) {<a name="line.617"></a>
-<span class="sourceLineNo">618</span>              this.results.add(new Pair&lt;&gt;(loc.getRegion(), loc.getServerName()));<a name="line.618"></a>
-<span class="sourceLineNo">619</span>            }<a name="line.619"></a>
-<span class="sourceLineNo">620</span>          }<a name="line.620"></a>
-<span class="sourceLineNo">621</span>        }<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      };<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    scanMeta(connection,<a name="line.623"></a>
-<span class="sourceLineNo">624</span>        getTableStartRowForMeta(tableName, QueryType.REGION),<a name="line.624"></a>
-<span class="sourceLineNo">625</span>        getTableStopRowForMeta(tableName, QueryType.REGION),<a name="line.625"></a>
-<span class="sourceLineNo">626</span>        QueryType.REGION, visitor);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    return visitor.getResults();<a name="line.627"></a>
-<span class="sourceLineNo">628</span>  }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>  /**<a name="line.630"></a>
-<span class="sourceLineNo">631</span>   * @param connection connection we're using<a name="line.631"></a>
-<span class="sourceLineNo">632</span>   * @param serverName server whose regions we're interested in<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * @return List of user regions installed on this server (does not include<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * catalog regions).<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   * @throws IOException<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   */<a name="line.636"></a>
-<span class="sourceLineNo">637</span>  public static NavigableMap&lt;RegionInfo, Result&gt;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>  getServerUserRegions(Connection connection, final ServerName serverName)<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    throws IOException {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    final NavigableMap&lt;RegionInfo, Result&gt; hris = new TreeMap&lt;&gt;();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    // Fill the above hris map with entries from hbase:meta that have the passed<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    // servername.<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    CollectingVisitor&lt;Result&gt; v = new CollectingVisitor&lt;Result&gt;() {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      @Override<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      void add(Result r) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        if (r == null || r.isEmpty()) return;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        RegionLocations locations = getRegionLocations(r);<a name="line.647"></a>
-<span class="sourceLineNo">648</span>        if (locations == null) return;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>          if (loc != null) {<a name="line.650"></a>
-<span class="sourceLineNo">651</span>            if (loc.getServerName() != null &amp;&amp; loc.getServerName().equals(serverName)) {<a name="line.651"></a>
-<span class="sourceLineNo">652</span>              hris.put(loc.getRegion(), r);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>            }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>          }<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    };<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    scanMeta(connection, null, null, QueryType.REGION, v);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    return hris;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>  }<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  public static void fullScanMetaAndPrint(Connection connection)<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    throws IOException {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    Visitor v = new Visitor() {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      @Override<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      public boolean visit(Result r) throws IOException {<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        if (r ==  null || r.isEmpty()) return true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        LOG.info("fullScanMetaAndPrint.Current Meta Row: " + r);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        TableState state = getTableState(r);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (state != null) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          LOG.info("Table State: " + state);<a name="line.671"></a>
-<span class="sourceLineNo">672</span>        } else {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>          RegionLocations locations = getRegionLocations(r);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>          if (locations == null) return true;<a name="line.674"></a>
-<span class="sourceLineNo">675</span>          for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.675"></a>
-<span class="sourceLineNo">676</span>            if (loc != null) {<a name="line.676"></a>
-<span class="sourceLineNo">677</span>              LOG.info("fullScanMetaAndPrint.HRI Print= " + loc.getRegion());<a name="line.677"></a>
-<span class="sourceLineNo">678</span>            }<a name="line.678"></a>
-<span class="sourceLineNo">679</span>          }<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        }<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        return true;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      }<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    };<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    scanMeta(connection, null, null, QueryType.ALL, v);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  }<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>  public static void scanMetaForTableRegions(Connection connection, Visitor visitor,<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      TableName tableName) throws IOException {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    scanMeta(connection, tableName, QueryType.REGION, Integer.MAX_VALUE, visitor);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>  }<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>  public static void scanMeta(Connection connection, TableName table, QueryType type, int maxRows,<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      final Visitor visitor) throws IOException {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    scanMeta(connection, getTableStartRowForMeta(table, type), getTableStopRowForMeta(table, type),<a name="line.694"></a>
-<span class="sourceLineNo">695</span> 

<TRUNCATED>

[50/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 2e471d7..d807e05 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="20180504" />
+    <meta name="Date-Revision-yyyymmdd" content="20180505" />
     <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>15864</td></tr></table></div>
+<td>15865</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>30</td></tr>
+<td>31</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>
@@ -10229,7 +10229,7 @@
 <tr class="b">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_blocks.html#NeedBraces">NeedBraces</a></td>
-<td>1936</td>
+<td>1935</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td>coding</td>
@@ -10322,12 +10322,12 @@
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#JavadocTagContinuationIndentation">JavadocTagContinuationIndentation</a>
 <ul>
 <li>offset: <tt>&quot;2&quot;</tt></li></ul></td>
-<td>783</td>
+<td>797</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#NonEmptyAtclauseDescription">NonEmptyAtclauseDescription</a></td>
-<td>3836</td>
+<td>3822</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td>misc</td>
@@ -10345,7 +10345,7 @@
 <ul>
 <li>max: <tt>&quot;100&quot;</tt></li>
 <li>ignorePattern: <tt>&quot;^package.*|^import.*|a href|href|http://|https://|ftp://|org.apache.thrift.|com.google.protobuf.|hbase.protobuf.generated&quot;</tt></li></ul></td>
-<td>1613</td>
+<td>1615</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
@@ -14536,7 +14536,7 @@
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
+<td>JavadocTagContinuationIndentation</td>
 <td>Javadoc comment at column 26 has parse error. Missed HTML close tag 'arg'. Sometimes it means that close tag missed for one of previous tags.</td>
 <td>44</td></tr></table></div>
 <div class="section">
@@ -15172,7 +15172,7 @@
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
+<td>JavadocTagContinuationIndentation</td>
 <td>Javadoc comment at column 4 has parse error. Missed HTML close tag 'pre'. Sometimes it means that close tag missed for one of previous tags.</td>
 <td>59</td></tr></table></div>
 <div class="section">
@@ -16386,373 +16386,373 @@
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>179</td></tr>
+<td>169</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>287</td></tr>
+<td>277</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 1, expected level should be 2.</td>
-<td>399</td></tr>
+<td>389</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>455</td></tr>
+<td>445</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 4, expected level should be 6.</td>
-<td>486</td></tr>
+<td>476</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 6, expected level should be 8.</td>
-<td>487</td></tr>
+<td>477</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 6, expected level should be 8.</td>
-<td>488</td></tr>
+<td>478</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 6, expected level should be 8.</td>
-<td>489</td></tr>
+<td>479</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 6, expected level should be 8.</td>
-<td>490</td></tr>
+<td>480</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 6, expected level should be 8.</td>
-<td>491</td></tr>
+<td>481</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 4, expected level should be 6.</td>
-<td>492</td></tr>
+<td>482</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 4, expected level should be 6.</td>
-<td>493</td></tr>
+<td>483</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 4, expected level should be 6.</td>
-<td>494</td></tr>
+<td>484</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 6, expected level should be 8.</td>
-<td>495</td></tr>
+<td>485</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 4, expected level should be 6.</td>
-<td>509</td></tr>
+<td>499</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 6, expected level should be 8.</td>
-<td>510</td></tr>
+<td>500</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 6, expected level should be 8.</td>
-<td>511</td></tr>
+<td>501</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 6, expected level should be 8.</td>
-<td>512</td></tr>
+<td>502</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 6, expected level should be 8.</td>
-<td>513</td></tr>
+<td>503</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 6, expected level should be 8.</td>
-<td>514</td></tr>
+<td>504</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 6, expected level should be 8.</td>
-<td>515</td></tr>
+<td>505</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 4, expected level should be 6.</td>
-<td>516</td></tr>
+<td>506</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 4, expected level should be 6.</td>
-<td>517</td></tr>
+<td>507</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 4, expected level should be 6.</td>
-<td>518</td></tr>
+<td>508</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 6, expected level should be 8.</td>
-<td>519</td></tr>
+<td>509</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 6, expected level should be 8.</td>
-<td>520</td></tr>
+<td>510</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 6, expected level should be 8.</td>
-<td>521</td></tr>
+<td>511</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 6, expected level should be 8.</td>
-<td>522</td></tr>
+<td>512</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
-<td>536</td></tr>
+<td>526</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>570</td></tr>
+<td>560</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>584</td></tr>
+<td>574</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>606</td></tr>
+<td>596</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>634</td></tr>
+<td>624</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>635</td></tr>
+<td>625</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'getServerUserRegions' have incorrect indentation level 2, expected level should be 4.</td>
-<td>638</td></tr>
+<td>628</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>646</td></tr>
+<td>636</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>648</td></tr>
+<td>638</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>667</td></tr>
+<td>657</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>674</td></tr>
+<td>664</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>777</td></tr>
+<td>767</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>779</td></tr>
+<td>769</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>780</td></tr>
+<td>770</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>930</td></tr>
+<td>920</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>935</td></tr>
+<td>925</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>953</td></tr>
+<td>943</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>960</td></tr>
+<td>950</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>964</td></tr>
+<td>954</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>966</td></tr>
+<td>956</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>974</td></tr>
+<td>964</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>982</td></tr>
+<td>972</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1040</td></tr>
+<td>1030</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>1050</td></tr>
+<td>1040</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>1064</td></tr>
+<td>1054</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1078</td></tr>
+<td>1068</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1096</td></tr>
+<td>1086</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1105</td></tr>
+<td>1095</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1118</td></tr>
+<td>1108</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>1154</td></tr>
+<td>1144</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>1182</td></tr>
+<td>1172</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1420</td></tr>
+<td>1410</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1509</td></tr>
+<td>1499</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1810</td></tr></table></div>
+<td>1800</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.MiniHBaseCluster.java">org/apache/hadoop/hbase/MiniHBaseCluster.java</h3>
 <table border="0" class="table table-striped">
@@ -16927,7 +16927,7 @@
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
+<td>JavadocTagContinuationIndentation</td>
 <td>Javadoc comment at column 19 has parse error. Details: no viable alternative at input '&lt;code&gt;\n   *   List&lt;Future&lt;' while parsing HTML_TAG</td>
 <td>167</td></tr></table></div>
 <div class="section">
@@ -17037,155 +17037,161 @@
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1088</td></tr>
+<td>1094</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
-<td>1089</td></tr>
+<td>1095</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1093</td></tr>
+<td>1099</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1102</td></tr>
+<td>1108</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 103).</td>
+<td>1167</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 106).</td>
+<td>1170</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1195</td></tr>
+<td>1262</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1197</td></tr>
+<td>1264</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
-<td>1202</td></tr>
+<td>1269</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1352</td></tr>
+<td>1422</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
-<td>1358</td></tr>
+<td>1428</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
-<td>1585</td></tr>
+<td>1667</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
-<td>1622</td></tr>
+<td>1711</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1723</td></tr>
+<td>1817</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>UpperEll</td>
 <td>Should use uppercase 'L'.</td>
-<td>1864</td></tr>
+<td>1961</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
-<td>2007</td></tr>
+<td>2107</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2011</td></tr>
+<td>2265</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2158</td></tr>
+<td>2266</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>2159</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>2191</td></tr>
-<tr class="b">
+<td>2298</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
-<td>2250</td></tr>
-<tr class="a">
+<td>2357</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 118).</td>
-<td>2254</td></tr>
-<tr class="b">
+<td>2361</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
-<td>2258</td></tr>
-<tr class="a">
+<td>2365</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 266 lines (max allowed is 150).</td>
-<td>2286</td></tr>
-<tr class="b">
+<td>2393</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2426</td></tr>
-<tr class="a">
+<td>2533</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
-<td>2455</td></tr></table></div>
+<td>2562</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.PerformanceEvaluationCommons.java">org/apache/hadoop/hbase/PerformanceEvaluationCommons.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -17194,409 +17200,409 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.PrivateCellUtil.java">org/apache/hadoop/hbase/PrivateCellUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>843</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>844</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>845</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>863</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>864</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>865</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>984</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>985</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>986</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>987</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>988</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1010</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1203</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1204</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1214</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1215</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1228</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1229</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1243</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1244</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1281</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1282</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2140</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2141</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2142</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2175</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2190</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2266</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2267</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2281</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2282</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2296</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2312</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2313</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2328</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2346</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2362</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2378</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2395</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2415</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2431</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2448</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2452</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2455</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2459</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>2460</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2465</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2478</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2491</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2504</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2517</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2596</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2735</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2753</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2761</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2776</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2787</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2802</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>2807</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2815</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2881</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2882</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2883</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2884</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2906</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>2925</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -17605,25 +17611,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.QosTestHelper.java">org/apache/hadoop/hbase/QosTestHelper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td>21</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.regionserver.AnnotationReadingPriorityFunction' import.</td>
 <td>23</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -17632,19 +17638,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.RESTApiClusterManager.java">org/apache/hadoop/hbase/RESTApiClusterManager.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'javax.ws.rs.client.Client' import.</td>
 <td>31</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -17653,13 +17659,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.RegionLoad.java">org/apache/hadoop/hbase/RegionLoad.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -17668,73 +17674,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.RegionLocations.java">org/apache/hadoop/hbase/RegionLocations.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>72</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>120</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>143</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>146</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>147</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>149</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>154</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>170</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>194</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>266</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -17743,19 +17749,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.RegionStateListener.java">org/apache/hadoop/hbase/RegionStateListener.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>36</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -17764,31 +17770,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ResourceChecker.java">org/apache/hadoop/hbase/ResourceChecker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>87</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 43 should have line break after.</td>
 <td>94</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>145</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -17797,79 +17803,79 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ScanPerformanceEvaluation.java">org/apache/hadoop/hbase/ScanPerformanceEvaluation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Connection' import.</td>
 <td>29</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 155).</td>
 <td>82</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>198</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>200</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>255</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>257</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>325</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>327</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>330</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>381</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>383</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
@@ -17878,37 +17884,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ScheduledChore.java">org/apache/hadoop/hbase/ScheduledChore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>176</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>180</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>189</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>213</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -17917,13 +17923,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.Server.java">org/apache/hadoop/hbase/Server.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -17932,13 +17938,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ServerLoad.java">org/apache/hadoop/hbase/ServerLoad.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -17947,151 +17953,151 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.ServerName.java">org/apache/hadoop/hbase/ServerName.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>124</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>131</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>133</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>207</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>208</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>209</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>219</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>246</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>247</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>248</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>250</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>267</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>269</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>276</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>356</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>357</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>358</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>363</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>364</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>370</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>371</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>398</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>409</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -18100,13 +18106,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.SplitLogCounters.java">org/apache/hadoop/hbase/SplitLogCounters.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -18115,31 +18121,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.SplitLogTask.java">org/apache/hadoop/hbase/SplitLogTask.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
 <td>23</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>131</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -18148,25 +18154,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.StripeCompactionsPerformanceEvaluation.java">org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>110</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td>114</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -18175,55 +18181,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TableDescriptors.java">org/apache/hadoop/hbase/TableDescriptors.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.TableDescriptor' import.</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>33</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>35</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>43</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>52</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>60</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>66</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -18232,43 +18238,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TableInfoMissingException.java">org/apache/hadoop/hbase/TableInfoMissingException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>35</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>35</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>39</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>39</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>43</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -18277,109 +18283,109 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TableName.java">org/apache/hadoop/hbase/TableName.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>123</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>125</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>127</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>130</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>132</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>134</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>135</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>136</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 6, expected level should be 4.</td>
 <td>178</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>186</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>190</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>428</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>429</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>457</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>510</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>511</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -18388,13 +18394,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TableNotDisabledException.java">org/apache/hadoop/hbase/TableNotDisabledException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -18403,13 +18409,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TableNotEnabledException.java">org/apache/hadoop/hbase/TableNotEnabledException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -18418,13 +18424,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TableNotFoundException.java">org/apache/hadoop/hbase/TableNotFoundException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -18433,13 +18439,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TagType.java">org/apache/hadoop/hbase/TagType.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -18448,19 +18454,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestCheckTestClasses.java">org/apache/hadoop/hbase/TestCheckTestClasses.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.testclassification.MediumTests' import.</td>
 <td>26</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>RedundantImport</td>
@@ -18469,13 +18475,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestClassFinder.java">org/apache/hadoop/hbase/TestClassFinder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -18484,19 +18490,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestClientClusterStatus.java">org/apache/hadoop/hbase/TestClientClusterStatus.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.util.Threads.</td>
 <td>40</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -18505,13 +18511,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestClientOperationTimeout.java">org/apache/hadoop/hbase/TestClientOperationTimeout.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -18520,13 +18526,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestClusterPortAssignment.java">org/apache/hadoop/hbase/TestClusterPortAssignment.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
@@ -18535,13 +18541,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestFSTableDescriptorForceCreation.java">org/apache/hadoop/hbase/TestFSTableDescriptorForceCreation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -18550,37 +18556,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestGlobalMemStoreSize.java">org/apache/hadoop/hbase/TestGlobalMemStoreSize.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>73</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>153</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>154</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>155</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -18589,13 +18595,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestHBaseConfiguration.java">org/apache/hadoop/hbase/TestHBaseConfiguration.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -18604,55 +18610,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestHBaseTestingUtility.java">org/apache/hadoop/hbase/TestHBaseTestingUtility.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.io.IOException.</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.util.HashMap.</td>
 <td>30</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.util.Map.</td>
 <td>32</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - java.util.Map.Entry.</td>
 <td>33</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>79</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>202</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>206</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
@@ -18661,13 +18667,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestHColumnDescriptor.java">org/apache/hadoop/hbase/TestHColumnDescriptor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
@@ -18676,13 +18682,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestHColumnDescriptorDefaultVersions.java">org/apache/hadoop/hbase/TestHColumnDescriptorDefaultVersions.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -18691,73 +18697,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestHTableDescriptor.java">org/apache/hadoop/hbase/TestHTableDescriptor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td>45</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>121</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>138</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>175</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>188</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child have incorrect indentation level 6, expected level should be one of the following: 4, 31.</td>
 <td>189</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child have incorrect indentation level 6, expected level should be one of the following: 4, 31.</td>
 <td>191</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child have incorrect indentation level 6, expected level should be one of the following: 4, 31.</td>
 <td>192</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>194</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child have incorrect indentation level 6, expected level should be one of the following: 4, 33.</td>
 <td>195</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -18766,25 +18772,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestIOFencing.java">org/apache/hadoop/hbase/TestIOFencing.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.regionserver.Store.</td>
 <td>44</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>92</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
@@ -18793,13 +18799,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestInfoServers.java">org/apache/hadoop/hbase/TestInfoServers.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -18808,25 +18814,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestJMXConnectorServer.java">org/apache/hadoop/hbase/TestJMXConnectorServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.security.access.AccessControlLists.</td>
 <td>31</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>UnusedImports</td>
 <td>Unused import - org.apache.hadoop.hbase.util.Threads.</td>
 <td>35</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -18835,25 +18841,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestKeyValue.java">org/apache/hadoop/hbase/TestKeyValue.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'HBaseClassTestRule' have incorrect indentation level 2, expected level should be 4.</td>
 <td>51</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>188</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -18862,13 +18868,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestLocalHBaseCluster.java">org/apache/hadoop/hbase/TestLocalHBaseCluster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
@@ -18877,37 +18883,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestMetaTableAccessor.java">org/apache/hadoop/hbase/TestMetaTableAccessor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>111</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>112</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>219</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>220</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -18916,49 +18922,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestMetaTableAccessorNoCluster.java">org/apache/hadoop/hbase/TestMetaTableAccessorNoCluster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>116</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>126</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>127</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'(' have incorrect indentation level 6, expected level should be 8.</td>
 <td>194</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' should be on the previous line.</td>
 <td>194</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 122).</td>
 <td>205</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -18967,205 +18973,205 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.TestMetaTableLocator.java">org/apache/hadoop/hbase/TestMetaTableLocator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>129</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should ha

<TRUNCATED>

[12/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException 

<TRUNCATED>

[46/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.CloseableVisitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.CloseableVisitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.CloseableVisitor.html
index cdd2f36..fea2b5a 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.CloseableVisitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/MetaTableAccessor.CloseableVisitor.html
@@ -151,2029 +151,2019 @@
 <span class="sourceLineNo">143</span>  private static final Logger LOG = LoggerFactory.getLogger(MetaTableAccessor.class);<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  private static final Logger METALOG = LoggerFactory.getLogger("org.apache.hadoop.hbase.META");<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final byte[] META_REGION_PREFIX;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>  static {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    // Copy the prefix from FIRST_META_REGIONINFO into META_REGION_PREFIX.<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    // FIRST_META_REGIONINFO == 'hbase:meta,,1'.  META_REGION_PREFIX == 'hbase:meta,'<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    int len = RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName().length - 2;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    META_REGION_PREFIX = new byte [len];<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    System.arraycopy(RegionInfoBuilder.FIRST_META_REGIONINFO.getRegionName(), 0,<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      META_REGION_PREFIX, 0, len);<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>  @VisibleForTesting<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  public static final byte[] REPLICATION_PARENT_QUALIFIER = Bytes.toBytes("parent");<a name="line.157"></a>
-<span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private static final byte ESCAPE_BYTE = (byte) 0xFF;<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  private static final byte SEPARATED_BYTE = 0x00;<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>  /**<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * Lists all of the table regions currently in META.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   * Deprecated, keep there until some test use this.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @param connection what we will use<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * @param tableName table to list<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * @return Map of all user-space regions to servers<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   * @deprecated use {@link #getTableRegionsAndLocations}, region can have multiple locations<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  @Deprecated<a name="line.171"></a>
-<span class="sourceLineNo">172</span>  public static NavigableMap&lt;RegionInfo, ServerName&gt; allTableRegions(<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      Connection connection, final TableName tableName) throws IOException {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    final NavigableMap&lt;RegionInfo, ServerName&gt; regions = new TreeMap&lt;&gt;();<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    Visitor visitor = new TableVisitorBase(tableName) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      @Override<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      public boolean visitInternal(Result result) throws IOException {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>        RegionLocations locations = getRegionLocations(result);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        if (locations == null) return true;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>          if (loc != null) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>            RegionInfo regionInfo = loc.getRegionInfo();<a name="line.182"></a>
-<span class="sourceLineNo">183</span>            regions.put(regionInfo, loc.getServerName());<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>        return true;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    };<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    scanMetaForTableRegions(connection, visitor, tableName);<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    return regions;<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>  @InterfaceAudience.Private<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public enum QueryType {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    ALL(HConstants.TABLE_FAMILY, HConstants.CATALOG_FAMILY),<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    REGION(HConstants.CATALOG_FAMILY),<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    TABLE(HConstants.TABLE_FAMILY),<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    REPLICATION(HConstants.REPLICATION_BARRIER_FAMILY);<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>    private final byte[][] families;<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>    QueryType(byte[]... families) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      this.families = families;<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>    byte[][] getFamilies() {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      return this.families;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  }<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span>  /** The delimiter for meta columns for replicaIds &amp;gt; 0 */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  protected static final char META_REPLICA_ID_DELIMITER = '_';<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>  /** A regex for parsing server columns from meta. See above javadoc for meta layout */<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  private static final Pattern SERVER_COLUMN_PATTERN<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    = Pattern.compile("^server(_[0-9a-fA-F]{4})?$");<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>  ////////////////////////<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  // Reading operations //<a name="line.219"></a>
-<span class="sourceLineNo">220</span>  ////////////////////////<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.223"></a>
-<span class="sourceLineNo">224</span>   * @param connection connection we're using<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * @param visitor Visitor invoked against each row in regions family.<a name="line.225"></a>
+<span class="sourceLineNo">146</span>  @VisibleForTesting<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  public static final byte[] REPLICATION_PARENT_QUALIFIER = Bytes.toBytes("parent");<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final byte ESCAPE_BYTE = (byte) 0xFF;<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final byte SEPARATED_BYTE = 0x00;<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  /**<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * Lists all of the table regions currently in META.<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * Deprecated, keep there until some test use this.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   * @param connection what we will use<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   * @param tableName table to list<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   * @return Map of all user-space regions to servers<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   * @deprecated use {@link #getTableRegionsAndLocations}, region can have multiple locations<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   */<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  @Deprecated<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  public static NavigableMap&lt;RegionInfo, ServerName&gt; allTableRegions(<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      Connection connection, final TableName tableName) throws IOException {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    final NavigableMap&lt;RegionInfo, ServerName&gt; regions = new TreeMap&lt;&gt;();<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    Visitor visitor = new TableVisitorBase(tableName) {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      @Override<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      public boolean visitInternal(Result result) throws IOException {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        RegionLocations locations = getRegionLocations(result);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        if (locations == null) return true;<a name="line.169"></a>
+<span class="sourceLineNo">170</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>          if (loc != null) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>            RegionInfo regionInfo = loc.getRegionInfo();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>            regions.put(regionInfo, loc.getServerName());<a name="line.173"></a>
+<span class="sourceLineNo">174</span>          }<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>        return true;<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      }<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    };<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    scanMetaForTableRegions(connection, visitor, tableName);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    return regions;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>  @InterfaceAudience.Private<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  public enum QueryType {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    ALL(HConstants.TABLE_FAMILY, HConstants.CATALOG_FAMILY),<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    REGION(HConstants.CATALOG_FAMILY),<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    TABLE(HConstants.TABLE_FAMILY),<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    REPLICATION(HConstants.REPLICATION_BARRIER_FAMILY);<a name="line.188"></a>
+<span class="sourceLineNo">189</span><a name="line.189"></a>
+<span class="sourceLineNo">190</span>    private final byte[][] families;<a name="line.190"></a>
+<span class="sourceLineNo">191</span><a name="line.191"></a>
+<span class="sourceLineNo">192</span>    QueryType(byte[]... families) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      this.families = families;<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>    byte[][] getFamilies() {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      return this.families;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    }<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  }<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>  /** The delimiter for meta columns for replicaIds &amp;gt; 0 */<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  protected static final char META_REPLICA_ID_DELIMITER = '_';<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>  /** A regex for parsing server columns from meta. See above javadoc for meta layout */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  private static final Pattern SERVER_COLUMN_PATTERN<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    = Pattern.compile("^server(_[0-9a-fA-F]{4})?$");<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>  ////////////////////////<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  // Reading operations //<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  ////////////////////////<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>  /**<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * @param connection connection we're using<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * @param visitor Visitor invoked against each row in regions family.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   */<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  public static void fullScanRegions(Connection connection,<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      final Visitor visitor)<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      throws IOException {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    scanMeta(connection, null, null, QueryType.REGION, visitor);<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>  /**<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   * @param connection connection we're using<a name="line.225"></a>
 <span class="sourceLineNo">226</span>   */<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  public static void fullScanRegions(Connection connection,<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      final Visitor visitor)<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      throws IOException {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    scanMeta(connection, null, null, QueryType.REGION, visitor);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for regions.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   * @param connection connection we're using<a name="line.235"></a>
+<span class="sourceLineNo">227</span>  public static List&lt;Result&gt; fullScanRegions(Connection connection)<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      throws IOException {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    return fullScan(connection, QueryType.REGION);<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>  /**<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for tables.<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * @param connection connection we're using<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * @param visitor Visitor invoked against each row in tables family.<a name="line.235"></a>
 <span class="sourceLineNo">236</span>   */<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  public static List&lt;Result&gt; fullScanRegions(Connection connection)<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      throws IOException {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    return fullScan(connection, QueryType.REGION);<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt; for tables.<a name="line.243"></a>
-<span class="sourceLineNo">244</span>   * @param connection connection we're using<a name="line.244"></a>
-<span class="sourceLineNo">245</span>   * @param visitor Visitor invoked against each row in tables family.<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   */<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  public static void fullScanTables(Connection connection,<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      final Visitor visitor)<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      throws IOException {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    scanMeta(connection, null, null, QueryType.TABLE, visitor);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  }<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>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt;.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * @param connection connection we're using<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   * @param type scanned part of meta<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * @return List of {@link Result}<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  public static List&lt;Result&gt; fullScan(Connection connection, QueryType type)<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    throws IOException {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    CollectAllVisitor v = new CollectAllVisitor();<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    scanMeta(connection, null, null, type, v);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    return v.getResults();<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>  /**<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * Callers should call close on the returned {@link Table} instance.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * @param connection connection we're using to access Meta<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   * @return An {@link Table} for &lt;code&gt;hbase:meta&lt;/code&gt;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  public static Table getMetaHTable(final Connection connection)<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  throws IOException {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    // We used to pass whole CatalogTracker in here, now we just pass in Connection<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    if (connection == null) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      throw new NullPointerException("No connection");<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    } else if (connection.isClosed()) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      throw new IOException("connection is closed");<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    return connection.getTable(TableName.META_TABLE_NAME);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * @param t Table to use (will be closed when done).<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * @param g Get to run<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   */<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  private static Result get(final Table t, final Get g) throws IOException {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    if (t == null) return null;<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    try {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      return t.get(g);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    } finally {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      t.close();<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    }<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  /**<a name="line.295"></a>
-<span class="sourceLineNo">296</span>   * Gets the region info and assignment for the specified region.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   * @param connection connection we're using<a name="line.297"></a>
-<span class="sourceLineNo">298</span>   * @param regionName Region to lookup.<a name="line.298"></a>
-<span class="sourceLineNo">299</span>   * @return Location and RegionInfo for &lt;code&gt;regionName&lt;/code&gt;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * @deprecated use {@link #getRegionLocation(Connection, byte[])} instead<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  @Deprecated<a name="line.302"></a>
-<span class="sourceLineNo">303</span>  public static Pair&lt;RegionInfo, ServerName&gt; getRegion(Connection connection, byte [] regionName)<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    throws IOException {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    HRegionLocation location = getRegionLocation(connection, regionName);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    return location == null<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      ? null<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      : new Pair&lt;&gt;(location.getRegionInfo(), location.getServerName());<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  /**<a name="line.311"></a>
-<span class="sourceLineNo">312</span>   * Returns the HRegionLocation from meta for the given region<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * @param connection connection we're using<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   * @param regionName region we're looking for<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   * @return HRegionLocation for the given region<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   */<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  public static HRegionLocation getRegionLocation(Connection connection, byte[] regionName)<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      throws IOException {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    byte[] row = regionName;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    RegionInfo parsedInfo = null;<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    try {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      parsedInfo = parseRegionInfoFromRegionName(regionName);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      row = getMetaKeyForRegion(parsedInfo);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    } catch (Exception parseEx) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      // Ignore. This is used with tableName passed as regionName.<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    Get get = new Get(row);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    Result r = get(getMetaHTable(connection), get);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    RegionLocations locations = getRegionLocations(r);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    return locations == null ? null<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      : locations.getRegionLocation(parsedInfo == null ? 0 : parsedInfo.getReplicaId());<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  }<a name="line.333"></a>
-<span class="sourceLineNo">334</span><a name="line.334"></a>
-<span class="sourceLineNo">335</span>  /**<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   * Returns the HRegionLocation from meta for the given region<a name="line.336"></a>
-<span class="sourceLineNo">337</span>   * @param connection connection we're using<a name="line.337"></a>
-<span class="sourceLineNo">338</span>   * @param regionInfo region information<a name="line.338"></a>
-<span class="sourceLineNo">339</span>   * @return HRegionLocation for the given region<a name="line.339"></a>
-<span class="sourceLineNo">340</span>   */<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  public static HRegionLocation getRegionLocation(Connection connection, RegionInfo regionInfo)<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throws IOException {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    byte[] row = getMetaKeyForRegion(regionInfo);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    Get get = new Get(row);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    Result r = get(getMetaHTable(connection), get);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    return getRegionLocation(r, regionInfo, regionInfo.getReplicaId());<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  }<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  /** Returns the row key to use for this regionInfo */<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  public static byte[] getMetaKeyForRegion(RegionInfo regionInfo) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    return RegionReplicaUtil.getRegionInfoForDefaultReplica(regionInfo).getRegionName();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  }<a name="line.353"></a>
-<span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>  /** Returns an HRI parsed from this regionName. Not all the fields of the HRI<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * is stored in the name, so the returned object should only be used for the fields<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   * in the regionName.<a name="line.357"></a>
-<span class="sourceLineNo">358</span>   */<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  public static RegionInfo parseRegionInfoFromRegionName(byte[] regionName) throws IOException {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    byte[][] fields = RegionInfo.parseRegionName(regionName);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    long regionId = Long.parseLong(Bytes.toString(fields[2]));<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    int replicaId = fields.length &gt; 3 ? Integer.parseInt(Bytes.toString(fields[3]), 16) : 0;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    return RegionInfoBuilder.newBuilder(TableName.valueOf(fields[0]))<a name="line.363"></a>
-<span class="sourceLineNo">364</span>              .setStartKey(fields[1])<a name="line.364"></a>
-<span class="sourceLineNo">365</span>              .setEndKey(fields[2])<a name="line.365"></a>
-<span class="sourceLineNo">366</span>              .setSplit(false)<a name="line.366"></a>
-<span class="sourceLineNo">367</span>              .setRegionId(regionId)<a name="line.367"></a>
-<span class="sourceLineNo">368</span>              .setReplicaId(replicaId)<a name="line.368"></a>
-<span class="sourceLineNo">369</span>              .build();<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>  /**<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * Gets the result in hbase:meta for the specified region.<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * @param connection connection we're using<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   * @param regionName region we're looking for<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   * @return result of the specified region<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   */<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public static Result getRegionResult(Connection connection,<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      byte[] regionName) throws IOException {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    Get get = new Get(regionName);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    return get(getMetaHTable(connection), get);<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>   * Get regions from the merge qualifier of the specified merged region<a name="line.386"></a>
-<span class="sourceLineNo">387</span>   * @return null if it doesn't contain merge qualifier, else two merge regions<a name="line.387"></a>
-<span class="sourceLineNo">388</span>   */<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  @Nullable<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  public static Pair&lt;RegionInfo, RegionInfo&gt; getRegionsFromMergeQualifier(<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      Connection connection, byte[] regionName) throws IOException {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Result result = getRegionResult(connection, regionName);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    RegionInfo mergeA = getRegionInfo(result, HConstants.MERGEA_QUALIFIER);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    RegionInfo mergeB = getRegionInfo(result, HConstants.MERGEB_QUALIFIER);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    if (mergeA == null &amp;&amp; mergeB == null) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      return null;<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    }<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    return new Pair&lt;&gt;(mergeA, mergeB);<a name="line.398"></a>
-<span class="sourceLineNo">399</span> }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>  /**<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * Checks if the specified table exists.  Looks at the hbase:meta table hosted on<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   * the specified server.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>   * @param connection connection we're using<a name="line.404"></a>
-<span class="sourceLineNo">405</span>   * @param tableName table to check<a name="line.405"></a>
-<span class="sourceLineNo">406</span>   * @return true if the table exists in meta, false if not<a name="line.406"></a>
-<span class="sourceLineNo">407</span>   */<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public static boolean tableExists(Connection connection,<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      final TableName tableName)<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  throws IOException {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // Catalog tables always exist.<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return tableName.equals(TableName.META_TABLE_NAME)<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        || getTableState(connection, tableName) != null;<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>   * Lists all of the regions currently in META.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   *<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   * @param connection to connect with<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   * @param excludeOfflinedSplitParents False if we are to include offlined/splitparents regions,<a name="line.420"></a>
-<span class="sourceLineNo">421</span>   *                                    true and we'll leave out offlined regions from returned list<a name="line.421"></a>
-<span class="sourceLineNo">422</span>   * @return List of all user-space regions.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   */<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  @VisibleForTesting<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  public static List&lt;RegionInfo&gt; getAllRegions(Connection connection,<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      boolean excludeOfflinedSplitParents)<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      throws IOException {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result;<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>    result = getTableRegionsAndLocations(connection, null,<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        excludeOfflinedSplitParents);<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>    return getListOfRegionInfos(result);<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  /**<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * @param connection connection we're using<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * @param tableName table we're looking for<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   */<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName)<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  throws IOException {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return getTableRegions(connection, tableName, false);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  /**<a name="line.449"></a>
-<span class="sourceLineNo">450</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.450"></a>
-<span class="sourceLineNo">451</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * @param connection connection we're using<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   * @param tableName table we're looking for<a name="line.453"></a>
-<span class="sourceLineNo">454</span>   * @param excludeOfflinedSplitParents If true, do not include offlined split<a name="line.454"></a>
-<span class="sourceLineNo">455</span>   * parents in the return.<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   */<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName,<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result =<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      getTableRegionsAndLocations(connection, tableName, excludeOfflinedSplitParents);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    return getListOfRegionInfos(result);<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>  private static List&lt;RegionInfo&gt; getListOfRegionInfos(<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      final List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    if (pairs == null || pairs.isEmpty()) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      return Collections.emptyList();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    List&lt;RegionInfo&gt; result = new ArrayList&lt;&gt;(pairs.size());<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      result.add(pair.getFirst());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    return result;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  }<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>  /**<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * @param tableName table we're working with<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * @return start row for scanning META according to query type<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   */<a name="line.480"></a>
-<span class="sourceLineNo">481</span>  public static byte[] getTableStartRowForMeta(TableName tableName, QueryType type) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    if (tableName == null) {<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      return null;<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    switch (type) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    case REGION:<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      byte[] startRow = new byte[tableName.getName().length + 2];<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      System.arraycopy(tableName.getName(), 0, startRow, 0, tableName.getName().length);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      startRow[startRow.length - 2] = HConstants.DELIMITER;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      startRow[startRow.length - 1] = HConstants.DELIMITER;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      return startRow;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    case ALL:<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    case TABLE:<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    default:<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      return tableName.getName();<a name="line.495"></a>
+<span class="sourceLineNo">237</span>  public static void fullScanTables(Connection connection,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      final Visitor visitor)<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      throws IOException {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    scanMeta(connection, null, null, QueryType.TABLE, visitor);<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>  /**<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   * Performs a full scan of &lt;code&gt;hbase:meta&lt;/code&gt;.<a name="line.244"></a>
+<span class="sourceLineNo">245</span>   * @param connection connection we're using<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   * @param type scanned part of meta<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * @return List of {@link Result}<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   */<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  public static List&lt;Result&gt; fullScan(Connection connection, QueryType type)<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    throws IOException {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    CollectAllVisitor v = new CollectAllVisitor();<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    scanMeta(connection, null, null, type, v);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    return v.getResults();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  /**<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * Callers should call close on the returned {@link Table} instance.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * @param connection connection we're using to access Meta<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * @return An {@link Table} for &lt;code&gt;hbase:meta&lt;/code&gt;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  public static Table getMetaHTable(final Connection connection)<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  throws IOException {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    // We used to pass whole CatalogTracker in here, now we just pass in Connection<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    if (connection == null) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      throw new NullPointerException("No connection");<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    } else if (connection.isClosed()) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      throw new IOException("connection is closed");<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    return connection.getTable(TableName.META_TABLE_NAME);<a name="line.269"></a>
+<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  /**<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * @param t Table to use (will be closed when done).<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   * @param g Get to run<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  private static Result get(final Table t, final Get g) throws IOException {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    if (t == null) return null;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    try {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      return t.get(g);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    } finally {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      t.close();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  }<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * Gets the region info and assignment for the specified region.<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * @param connection connection we're using<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * @param regionName Region to lookup.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * @return Location and RegionInfo for &lt;code&gt;regionName&lt;/code&gt;<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * @deprecated use {@link #getRegionLocation(Connection, byte[])} instead<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   */<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  @Deprecated<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  public static Pair&lt;RegionInfo, ServerName&gt; getRegion(Connection connection, byte [] regionName)<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    throws IOException {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    HRegionLocation location = getRegionLocation(connection, regionName);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    return location == null<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      ? null<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      : new Pair&lt;&gt;(location.getRegionInfo(), location.getServerName());<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>  /**<a name="line.301"></a>
+<span class="sourceLineNo">302</span>   * Returns the HRegionLocation from meta for the given region<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * @param connection connection we're using<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * @param regionName region we're looking for<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * @return HRegionLocation for the given region<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   */<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  public static HRegionLocation getRegionLocation(Connection connection, byte[] regionName)<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      throws IOException {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    byte[] row = regionName;<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    RegionInfo parsedInfo = null;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    try {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      parsedInfo = parseRegionInfoFromRegionName(regionName);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      row = getMetaKeyForRegion(parsedInfo);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    } catch (Exception parseEx) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      // Ignore. This is used with tableName passed as regionName.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    Get get = new Get(row);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    Result r = get(getMetaHTable(connection), get);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    RegionLocations locations = getRegionLocations(r);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return locations == null ? null<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      : locations.getRegionLocation(parsedInfo == null ? 0 : parsedInfo.getReplicaId());<a name="line.322"></a>
+<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
+<span class="sourceLineNo">324</span><a name="line.324"></a>
+<span class="sourceLineNo">325</span>  /**<a name="line.325"></a>
+<span class="sourceLineNo">326</span>   * Returns the HRegionLocation from meta for the given region<a name="line.326"></a>
+<span class="sourceLineNo">327</span>   * @param connection connection we're using<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   * @param regionInfo region information<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   * @return HRegionLocation for the given region<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   */<a name="line.330"></a>
+<span class="sourceLineNo">331</span>  public static HRegionLocation getRegionLocation(Connection connection, RegionInfo regionInfo)<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      throws IOException {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    byte[] row = getMetaKeyForRegion(regionInfo);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    Get get = new Get(row);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    Result r = get(getMetaHTable(connection), get);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    return getRegionLocation(r, regionInfo, regionInfo.getReplicaId());<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  }<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  /** Returns the row key to use for this regionInfo */<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  public static byte[] getMetaKeyForRegion(RegionInfo regionInfo) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    return RegionReplicaUtil.getRegionInfoForDefaultReplica(regionInfo).getRegionName();<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  /** Returns an HRI parsed from this regionName. Not all the fields of the HRI<a name="line.345"></a>
+<span class="sourceLineNo">346</span>   * is stored in the name, so the returned object should only be used for the fields<a name="line.346"></a>
+<span class="sourceLineNo">347</span>   * in the regionName.<a name="line.347"></a>
+<span class="sourceLineNo">348</span>   */<a name="line.348"></a>
+<span class="sourceLineNo">349</span>  public static RegionInfo parseRegionInfoFromRegionName(byte[] regionName) throws IOException {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    byte[][] fields = RegionInfo.parseRegionName(regionName);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    long regionId = Long.parseLong(Bytes.toString(fields[2]));<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    int replicaId = fields.length &gt; 3 ? Integer.parseInt(Bytes.toString(fields[3]), 16) : 0;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    return RegionInfoBuilder.newBuilder(TableName.valueOf(fields[0]))<a name="line.353"></a>
+<span class="sourceLineNo">354</span>              .setStartKey(fields[1])<a name="line.354"></a>
+<span class="sourceLineNo">355</span>              .setEndKey(fields[2])<a name="line.355"></a>
+<span class="sourceLineNo">356</span>              .setSplit(false)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>              .setRegionId(regionId)<a name="line.357"></a>
+<span class="sourceLineNo">358</span>              .setReplicaId(replicaId)<a name="line.358"></a>
+<span class="sourceLineNo">359</span>              .build();<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  }<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * Gets the result in hbase:meta for the specified region.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   * @param connection connection we're using<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   * @param regionName region we're looking for<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   * @return result of the specified region<a name="line.366"></a>
+<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
+<span class="sourceLineNo">368</span>  public static Result getRegionResult(Connection connection,<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      byte[] regionName) throws IOException {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    Get get = new Get(regionName);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    get.addFamily(HConstants.CATALOG_FAMILY);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    return get(getMetaHTable(connection), get);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>  }<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>   * Get regions from the merge qualifier of the specified merged region<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * @return null if it doesn't contain merge qualifier, else two merge regions<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   */<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  @Nullable<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  public static Pair&lt;RegionInfo, RegionInfo&gt; getRegionsFromMergeQualifier(<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      Connection connection, byte[] regionName) throws IOException {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    Result result = getRegionResult(connection, regionName);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    RegionInfo mergeA = getRegionInfo(result, HConstants.MERGEA_QUALIFIER);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    RegionInfo mergeB = getRegionInfo(result, HConstants.MERGEB_QUALIFIER);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (mergeA == null &amp;&amp; mergeB == null) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      return null;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    return new Pair&lt;&gt;(mergeA, mergeB);<a name="line.388"></a>
+<span class="sourceLineNo">389</span> }<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>   * Checks if the specified table exists.  Looks at the hbase:meta table hosted on<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * the specified server.<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * @param connection connection we're using<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * @param tableName table to check<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   * @return true if the table exists in meta, false if not<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   */<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  public static boolean tableExists(Connection connection,<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      final TableName tableName)<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  throws IOException {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // Catalog tables always exist.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    return tableName.equals(TableName.META_TABLE_NAME)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        || getTableState(connection, tableName) != null;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>  /**<a name="line.406"></a>
+<span class="sourceLineNo">407</span>   * Lists all of the regions currently in META.<a name="line.407"></a>
+<span class="sourceLineNo">408</span>   *<a name="line.408"></a>
+<span class="sourceLineNo">409</span>   * @param connection to connect with<a name="line.409"></a>
+<span class="sourceLineNo">410</span>   * @param excludeOfflinedSplitParents False if we are to include offlined/splitparents regions,<a name="line.410"></a>
+<span class="sourceLineNo">411</span>   *                                    true and we'll leave out offlined regions from returned list<a name="line.411"></a>
+<span class="sourceLineNo">412</span>   * @return List of all user-space regions.<a name="line.412"></a>
+<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
+<span class="sourceLineNo">414</span>  @VisibleForTesting<a name="line.414"></a>
+<span class="sourceLineNo">415</span>  public static List&lt;RegionInfo&gt; getAllRegions(Connection connection,<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      boolean excludeOfflinedSplitParents)<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      throws IOException {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result;<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    result = getTableRegionsAndLocations(connection, null,<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        excludeOfflinedSplitParents);<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>    return getListOfRegionInfos(result);<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>  }<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>  /**<a name="line.427"></a>
+<span class="sourceLineNo">428</span>   * Gets all of the regions of the specified table. Do not use this method<a name="line.428"></a>
+<span class="sourceLineNo">429</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.429"></a>
+<span class="sourceLineNo">430</span>   * @param connection connection we're using<a name="line.430"></a>
+<span class="sourceLineNo">431</span>   * @param tableName table we're looking for<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName)<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  throws IOException {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    return getTableRegions(connection, tableName, false);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  }<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>   * Gets all of the regions of the specified table. Do not use this method<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * to get meta table regions, use methods in MetaTableLocator instead.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   * @param connection connection we're using<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @param tableName table we're looking for<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   * @param excludeOfflinedSplitParents If true, do not include offlined split<a name="line.444"></a>
+<span class="sourceLineNo">445</span>   * parents in the return.<a name="line.445"></a>
+<span class="sourceLineNo">446</span>   * @return Ordered list of {@link RegionInfo}.<a name="line.446"></a>
+<span class="sourceLineNo">447</span>   */<a name="line.447"></a>
+<span class="sourceLineNo">448</span>  public static List&lt;RegionInfo&gt; getTableRegions(Connection connection, TableName tableName,<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; result =<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      getTableRegionsAndLocations(connection, tableName, excludeOfflinedSplitParents);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    return getListOfRegionInfos(result);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  private static List&lt;RegionInfo&gt; getListOfRegionInfos(<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      final List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; pairs) {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    if (pairs == null || pairs.isEmpty()) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      return Collections.emptyList();<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    List&lt;RegionInfo&gt; result = new ArrayList&lt;&gt;(pairs.size());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    for (Pair&lt;RegionInfo, ServerName&gt; pair : pairs) {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      result.add(pair.getFirst());<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    return result;<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>  /**<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * @param tableName table we're working with<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * @return start row for scanning META according to query type<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   */<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  public static byte[] getTableStartRowForMeta(TableName tableName, QueryType type) {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    if (tableName == null) {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>      return null;<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    switch (type) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    case REGION:<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      byte[] startRow = new byte[tableName.getName().length + 2];<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      System.arraycopy(tableName.getName(), 0, startRow, 0, tableName.getName().length);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      startRow[startRow.length - 2] = HConstants.DELIMITER;<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      startRow[startRow.length - 1] = HConstants.DELIMITER;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>      return startRow;<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    case ALL:<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    case TABLE:<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    default:<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      return tableName.getName();<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    }<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
+<span class="sourceLineNo">488</span><a name="line.488"></a>
+<span class="sourceLineNo">489</span>  /**<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * @param tableName table we're working with<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   * @return stop row for scanning META according to query type<a name="line.491"></a>
+<span class="sourceLineNo">492</span>   */<a name="line.492"></a>
+<span class="sourceLineNo">493</span>  public static byte[] getTableStopRowForMeta(TableName tableName, QueryType type) {<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    if (tableName == null) {<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      return null;<a name="line.495"></a>
 <span class="sourceLineNo">496</span>    }<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>  /**<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   * @param tableName table we're working with<a name="line.500"></a>
-<span class="sourceLineNo">501</span>   * @return stop row for scanning META according to query type<a name="line.501"></a>
-<span class="sourceLineNo">502</span>   */<a name="line.502"></a>
-<span class="sourceLineNo">503</span>  public static byte[] getTableStopRowForMeta(TableName tableName, QueryType type) {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    if (tableName == null) {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      return null;<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    }<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    final byte[] stopRow;<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    switch (type) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    case REGION:<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      stopRow = new byte[tableName.getName().length + 3];<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      System.arraycopy(tableName.getName(), 0, stopRow, 0, tableName.getName().length);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      stopRow[stopRow.length - 3] = ' ';<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      stopRow[stopRow.length - 2] = HConstants.DELIMITER;<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      stopRow[stopRow.length - 1] = HConstants.DELIMITER;<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      break;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    case ALL:<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    case TABLE:<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    default:<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      stopRow = new byte[tableName.getName().length + 1];<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      System.arraycopy(tableName.getName(), 0, stopRow, 0, tableName.getName().length);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      stopRow[stopRow.length - 1] = ' ';<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      break;<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    }<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    return stopRow;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * This method creates a Scan object that will only scan catalog rows that<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   * belong to the specified table. It doesn't specify any columns.<a name="line.529"></a>
-<span class="sourceLineNo">530</span>   * This is a better alternative to just using a start row and scan until<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * it hits a new table since that requires parsing the HRI to get the table<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   * name.<a name="line.532"></a>
-<span class="sourceLineNo">533</span>   * @param tableName bytes of table's name<a name="line.533"></a>
-<span class="sourceLineNo">534</span>   * @return configured Scan object<a name="line.534"></a>
-<span class="sourceLineNo">535</span>   */<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  @Deprecated<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  public static Scan getScanForTableName(Connection connection, TableName tableName) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    // Start key is just the table name with delimiters<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    byte[] startKey = getTableStartRowForMeta(tableName, QueryType.REGION);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    // Stop key appends the smallest possible char to the table name<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    byte[] stopKey = getTableStopRowForMeta(tableName, QueryType.REGION);<a name="line.541"></a>
-<span class="sourceLineNo">542</span><a name="line.542"></a>
-<span class="sourceLineNo">543</span>    Scan scan = getMetaScan(connection, -1);<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    scan.setStartRow(startKey);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    scan.setStopRow(stopKey);<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    return scan;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>  private static Scan getMetaScan(Connection connection, int rowUpperLimit) {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    Scan scan = new Scan();<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    int scannerCaching = connection.getConfiguration()<a name="line.551"></a>
-<span class="sourceLineNo">552</span>        .getInt(HConstants.HBASE_META_SCANNER_CACHING,<a name="line.552"></a>
-<span class="sourceLineNo">553</span>            HConstants.DEFAULT_HBASE_META_SCANNER_CACHING);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    if (connection.getConfiguration().getBoolean(HConstants.USE_META_REPLICAS,<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        HConstants.DEFAULT_USE_META_REPLICAS)) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      scan.setConsistency(Consistency.TIMELINE);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    if (rowUpperLimit &gt; 0) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      scan.setLimit(rowUpperLimit);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      scan.setReadType(Scan.ReadType.PREAD);<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    }<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    scan.setCaching(scannerCaching);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    return scan;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  }<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  /**<a name="line.565"></a>
-<span class="sourceLineNo">566</span>   * Do not use this method to get meta table regions, use methods in MetaTableLocator instead.<a name="line.566"></a>
-<span class="sourceLineNo">567</span>   * @param connection connection we're using<a name="line.567"></a>
-<span class="sourceLineNo">568</span>   * @param tableName table we're looking for<a name="line.568"></a>
-<span class="sourceLineNo">569</span>   * @return Return list of regioninfos and server.<a name="line.569"></a>
-<span class="sourceLineNo">570</span>   * @throws IOException<a name="line.570"></a>
-<span class="sourceLineNo">571</span>   */<a name="line.571"></a>
-<span class="sourceLineNo">572</span>  public static List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    getTableRegionsAndLocations(Connection connection, TableName tableName)<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      throws IOException {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    return getTableRegionsAndLocations(connection, tableName, true);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>  }<a name="line.576"></a>
-<span class="sourceLineNo">577</span><a name="line.577"></a>
-<span class="sourceLineNo">578</span>  /**<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   * Do not use this method to get meta table regions, use methods in MetaTableLocator instead.<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param connection connection we're using<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param tableName table to work with, can be null for getting all regions<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @param excludeOfflinedSplitParents don't return split parents<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   * @return Return list of regioninfos and server addresses.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>   * @throws IOException<a name="line.584"></a>
-<span class="sourceLineNo">585</span>   */<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  public static List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; getTableRegionsAndLocations(<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      Connection connection, @Nullable final TableName tableName,<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      final boolean excludeOfflinedSplitParents) throws IOException {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    if (tableName != null &amp;&amp; tableName.equals(TableName.META_TABLE_NAME)) {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      throw new IOException("This method can't be used to locate meta regions;"<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        + " use MetaTableLocator instead");<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    }<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    // Make a version of CollectingVisitor that collects RegionInfo and ServerAddress<a name="line.593"></a>
-<span class="sourceLineNo">594</span>    CollectingVisitor&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; visitor =<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      new CollectingVisitor&lt;Pair&lt;RegionInfo, ServerName&gt;&gt;() {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>        private RegionLocations current = null;<a name="line.596"></a>
-<span class="sourceLineNo">597</span><a name="line.597"></a>
-<span class="sourceLineNo">598</span>        @Override<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        public boolean visit(Result r) throws IOException {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>          current = getRegionLocations(r);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          if (current == null || current.getRegionLocation().getRegion() == null) {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>            LOG.warn("No serialized RegionInfo in " + r);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>            return true;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>          }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          RegionInfo hri = current.getRegionLocation().getRegion();<a name="line.605"></a>
-<span class="sourceLineNo">606</span>          if (excludeOfflinedSplitParents &amp;&amp; hri.isSplitParent()) return true;<a name="line.606"></a>
-<span class="sourceLineNo">607</span>          // Else call super and add this Result to the collection.<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          return super.visit(r);<a name="line.608"></a>
-<span class="sourceLineNo">609</span>        }<a name="line.609"></a>
-<span class="sourceLineNo">610</span><a name="line.610"></a>
-<span class="sourceLineNo">611</span>        @Override<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        void add(Result r) {<a name="line.612"></a>
-<span class="sourceLineNo">613</span>          if (current == null) {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>            return;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>          }<a name="line.615"></a>
-<span class="sourceLineNo">616</span>          for (HRegionLocation loc : current.getRegionLocations()) {<a name="line.616"></a>
-<span class="sourceLineNo">617</span>            if (loc != null) {<a name="line.617"></a>
-<span class="sourceLineNo">618</span>              this.results.add(new Pair&lt;&gt;(loc.getRegion(), loc.getServerName()));<a name="line.618"></a>
-<span class="sourceLineNo">619</span>            }<a name="line.619"></a>
-<span class="sourceLineNo">620</span>          }<a name="line.620"></a>
-<span class="sourceLineNo">621</span>        }<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      };<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    scanMeta(connection,<a name="line.623"></a>
-<span class="sourceLineNo">624</span>        getTableStartRowForMeta(tableName, QueryType.REGION),<a name="line.624"></a>
-<span class="sourceLineNo">625</span>        getTableStopRowForMeta(tableName, QueryType.REGION),<a name="line.625"></a>
-<span class="sourceLineNo">626</span>        QueryType.REGION, visitor);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    return visitor.getResults();<a name="line.627"></a>
-<span class="sourceLineNo">628</span>  }<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>  /**<a name="line.630"></a>
-<span class="sourceLineNo">631</span>   * @param connection connection we're using<a name="line.631"></a>
-<span class="sourceLineNo">632</span>   * @param serverName server whose regions we're interested in<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * @return List of user regions installed on this server (does not include<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * catalog regions).<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   * @throws IOException<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   */<a name="line.636"></a>
-<span class="sourceLineNo">637</span>  public static NavigableMap&lt;RegionInfo, Result&gt;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>  getServerUserRegions(Connection connection, final ServerName serverName)<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    throws IOException {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    final NavigableMap&lt;RegionInfo, Result&gt; hris = new TreeMap&lt;&gt;();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    // Fill the above hris map with entries from hbase:meta that have the passed<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    // servername.<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    CollectingVisitor&lt;Result&gt; v = new CollectingVisitor&lt;Result&gt;() {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      @Override<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      void add(Result r) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>        if (r == null || r.isEmpty()) return;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        RegionLocations locations = getRegionLocations(r);<a name="line.647"></a>
-<span class="sourceLineNo">648</span>        if (locations == null) return;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>        for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>          if (loc != null) {<a name="line.650"></a>
-<span class="sourceLineNo">651</span>            if (loc.getServerName() != null &amp;&amp; loc.getServerName().equals(serverName)) {<a name="line.651"></a>
-<span class="sourceLineNo">652</span>              hris.put(loc.getRegion(), r);<a name="line.652"></a>
-<span class="sourceLineNo">653</span>            }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>          }<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        }<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    };<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    scanMeta(connection, null, null, QueryType.REGION, v);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    return hris;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>  }<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  public static void fullScanMetaAndPrint(Connection connection)<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    throws IOException {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    Visitor v = new Visitor() {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      @Override<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      public boolean visit(Result r) throws IOException {<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        if (r ==  null || r.isEmpty()) return true;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        LOG.info("fullScanMetaAndPrint.Current Meta Row: " + r);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        TableState state = getTableState(r);<a name="line.669"></a>
-<span class="sourceLineNo">670</span>        if (state != null) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>          LOG.info("Table State: " + state);<a name="line.671"></a>
-<span class="sourceLineNo">672</span>        } else {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>          RegionLocations locations = getRegionLocations(r);<a name="line.673"></a>
-<span class="sourceLineNo">674</span>          if (locations == null) return true;<a name="line.674"></a>
-<span class="sourceLineNo">675</span>          for (HRegionLocation loc : locations.getRegionLocations()) {<a name="line.675"></a>
-<span class="sourceLineNo">676</span>            if (loc != null) {<a name="line.676"></a>
-<span class="sourceLineNo">677</span>              LOG.info("fullScanMetaAndPrint.HRI Print= " + loc.getRegion());<a name="line.677"></a>
-<span class="sourceLineNo">678</span>            }<a name="line.678"></a>
-<span class="sourceLineNo">679</span>          }<a name="line.679"></a>
-<span class="sourceLineNo">680</span>        }<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        return true;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      }<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    };<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    scanMeta(connection, null, null, QueryType.ALL, v);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  }<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>  public static void scanMetaForTableRegions(Connection connection, Visitor visitor,<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      TableName tableName) throws IOException {<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    scanMeta(connection, tableName, QueryType.REGION, Integer.MAX_VALUE, visitor);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>  }<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>  public static void scanMeta(Connection connection, TableName table, QueryType type, int maxRows,<a name="line.692"></a>
-<span class="sourceLineNo">693</span>      final Visitor visitor) throws IOException {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    scanMeta(connection, getTableStartRowForMeta(table, type), getTableStopRowForMeta(table, type),<a name="line.694"></a>
-<span class="sourceLineNo">695</span>      

<TRUNCATED>

[17/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span class="sourceLine

<TRUNCATED>

[10/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="

<TRUNCATED>

[25/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 2510283..418c60c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html
@@ -77,77 +77,77 @@
 <span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.70"></a>
 <span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.client.Table;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.io.LongWritable;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.io.Text;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.mapreduce.Job;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.util.Tool;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.util.ToolRunner;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.htrace.core.Sampler;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.htrace.core.TraceScope;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.slf4j.Logger;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.slf4j.LoggerFactory;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>/**<a name="line.112"></a>
-<span class="sourceLineNo">113</span> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.113"></a>
-<span class="sourceLineNo">114</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * command-line which test to run and how many clients are participating in<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> *<a name="line.118"></a>
-<span class="sourceLineNo">119</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.121"></a>
-<span class="sourceLineNo">122</span> * paper, pages 8-10.<a name="line.122"></a>
-<span class="sourceLineNo">123</span> *<a name="line.123"></a>
-<span class="sourceLineNo">124</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.124"></a>
-<span class="sourceLineNo">125</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.125"></a>
-<span class="sourceLineNo">126</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.126"></a>
-<span class="sourceLineNo">127</span> * specified otherwise.<a name="line.127"></a>
-<span class="sourceLineNo">128</span> */<a name="line.128"></a>
-<span class="sourceLineNo">129</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.129"></a>
-<span class="sourceLineNo">130</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  static final String RANDOM_READ = "randomRead";<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  static {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<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>  public static final String TABLE_NAME = "TestTable";<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte [] QUALIFIER_NAME = COLUMN_ZERO;<a name="line.142"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PageFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.io.compress.Compression;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.hfile.RandomDistribution;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.regionserver.BloomType;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.regionserver.CompactingMemStore;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.trace.HBaseHTraceConfiguration;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.trace.SpanReceiverHost;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.util.ByteArrayHashKey;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.util.Hash;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.util.MurmurHash;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.util.YammerHistogramUtils;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.io.LongWritable;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.io.Text;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.mapreduce.Job;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.mapreduce.Mapper;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.hadoop.util.Tool;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.hadoop.util.ToolRunner;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.htrace.core.ProbabilitySampler;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.htrace.core.Sampler;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.apache.htrace.core.TraceScope;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.slf4j.Logger;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.slf4j.LoggerFactory;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<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> * Script used evaluating HBase performance and scalability.  Runs a HBase<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * client that steps through one of a set of hardcoded tests or 'experiments'<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * (e.g. a random reads test, a random writes test, etc.). Pass on the<a name="line.116"></a>
+<span class="sourceLineNo">117</span> * command-line which test to run and how many clients are participating in<a name="line.117"></a>
+<span class="sourceLineNo">118</span> * this experiment. Run {@code PerformanceEvaluation --help} to obtain usage.<a name="line.118"></a>
+<span class="sourceLineNo">119</span> *<a name="line.119"></a>
+<span class="sourceLineNo">120</span> * &lt;p&gt;This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, &lt;i&gt;Performance Evaluation&lt;/i&gt;, of the &lt;a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html"&gt;Bigtable&lt;/a&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span> * paper, pages 8-10.<a name="line.123"></a>
+<span class="sourceLineNo">124</span> *<a name="line.124"></a>
+<span class="sourceLineNo">125</span> * &lt;p&gt;By default, runs as a mapreduce job where each mapper runs a single test<a name="line.125"></a>
+<span class="sourceLineNo">126</span> * client. Can also run as a non-mapreduce, multithreaded application by<a name="line.126"></a>
+<span class="sourceLineNo">127</span> * specifying {@code --nomapred}. Each client does about 1GB of data, unless<a name="line.127"></a>
+<span class="sourceLineNo">128</span> * specified otherwise.<a name="line.128"></a>
+<span class="sourceLineNo">129</span> */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.130"></a>
+<span class="sourceLineNo">131</span>public class PerformanceEvaluation extends Configured implements Tool {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final String RANDOM_SEEK_SCAN = "randomSeekScan";<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  static final String RANDOM_READ = "randomRead";<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final ObjectMapper MAPPER = new ObjectMapper();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  static {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  public static final String TABLE_NAME = "TestTable";<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.142"></a>
 <span class="sourceLineNo">143</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.143"></a>
 <span class="sourceLineNo">144</span>  public static final int ROW_LENGTH = 26;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
@@ -1055,1591 +1055,1698 @@
 <span class="sourceLineNo">1047</span>    private String testName;<a name="line.1047"></a>
 <span class="sourceLineNo">1048</span>    private Histogram latencyHistogram;<a name="line.1048"></a>
 <span class="sourceLineNo">1049</span>    private Histogram valueSizeHistogram;<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>    private RandomDistribution.Zipf zipf;<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span><a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    /**<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>     * that has the exact same list of arguments.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>     */<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>      this.conf = conf;<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      this.opts = options;<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      this.status = status;<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      this.testName = this.getClass().getSimpleName();<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      } else {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        this.traceSampler = Sampler.NEVER;<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      }<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>      if (options.isValueZipf()) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>      }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    int getValueLength(final Random r) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>      if (this.opts.isValueRandom()) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return r.nextInt(opts.valueSize);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      } else if (this.opts.isValueZipf()) {<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        return Math.abs(this.zipf.nextInt());<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } else {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        return opts.valueSize;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>      }<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    }<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span><a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Result r: rs) updateValueSize(r);<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span><a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      int size = 0;<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>        size += scanner.current().getValueLength();<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      }<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      updateValueSize(size);<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    }<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span><a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    void updateValueSize(final int valueSize) {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>      if (!isRandomValueSize()) return;<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    }<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span><a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>    boolean isRandomValueSize() {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>      return opts.valueRandom;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    }<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span><a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    protected int getReportingPeriod() {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>      return opts.period;<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    }<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span><a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    /**<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>     */<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    public Histogram getLatencyHistogram() {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>      return latencyHistogram;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    }<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span><a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>    void testSetup() throws IOException {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      createConnection();<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>      onStartup();<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    }<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span><a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    abstract void createConnection() throws IOException;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span><a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    abstract void onStartup() throws IOException;<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span><a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    void testTakedown() throws IOException {<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      onTakedown();<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>      // Print all stats for this thread continuously.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      synchronized (Test.class) {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>            latencyHistogram));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>      }<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>      closeConnection();<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>      receiverHost.closeReceivers();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    }<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span><a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    abstract void onTakedown() throws IOException;<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span><a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>    abstract void closeConnection() throws IOException;<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span><a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>    /*<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>     * Run test<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>     * @return Elapsed time.<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>     * @throws IOException<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>     */<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    long test() throws IOException, InterruptedException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>      testSetup();<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      final long startTime = System.nanoTime();<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>      try {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        testTimed();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>      } finally {<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>        testTakedown();<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>      }<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    }<a name="line.1176"></a>
+<span class="sourceLineNo">1050</span>    private Histogram rpcCallsHistogram;<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    private Histogram remoteRpcCallsHistogram;<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    private Histogram millisBetweenNextHistogram;<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>    private Histogram regionsScannedHistogram;<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>    private Histogram bytesInResultsHistogram;<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>    private Histogram bytesInRemoteResultsHistogram;<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>    private RandomDistribution.Zipf zipf;<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span><a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    /**<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>     * Note that all subclasses of this class must provide a public constructor<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>     * that has the exact same list of arguments.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>     */<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    TestBase(final Configuration conf, final TestOptions options, final Status status) {<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>      this.conf = conf;<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>      this.receiverHost = this.conf == null? null: SpanReceiverHost.getInstance(conf);<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>      this.opts = options;<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>      this.status = status;<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>      this.testName = this.getClass().getSimpleName();<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>      if (options.traceRate &gt;= 1.0) {<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        this.traceSampler = Sampler.ALWAYS;<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>      } else if (options.traceRate &gt; 0.0) {<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        conf.setDouble("hbase.sampler.fraction", options.traceRate);<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>        this.traceSampler = new ProbabilitySampler(new HBaseHTraceConfiguration(conf));<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>      } else {<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>        this.traceSampler = Sampler.NEVER;<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>      if (options.isValueZipf()) {<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span>        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);<a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>      }<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span><a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    int getValueLength(final Random r) {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>      if (this.opts.isValueRandom()) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>        return r.nextInt(opts.valueSize);<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>      } else if (this.opts.isValueZipf()) {<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>        return Math.abs(this.zipf.nextInt());<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>      } else {<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>        return opts.valueSize;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>      }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>    }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span><a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    void updateValueSize(final Result [] rs) throws IOException {<a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      if (rs == null || !isRandomValueSize()) return;<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      for (Result r: rs) updateValueSize(r);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    }<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    void updateValueSize(final Result r) throws IOException {<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      if (r == null || !isRandomValueSize()) return;<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>      int size = 0;<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        size += scanner.current().getValueLength();<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      updateValueSize(size);<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    }<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span><a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    void updateValueSize(final int valueSize) {<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      if (!isRandomValueSize()) return;<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>      this.valueSizeHistogram.update(valueSize);<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    void updateScanMetrics(final ScanMetrics metrics) {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>      Map&lt;String,Long&gt; metricsMap = metrics.getMetricsMap();<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      if (rpcCalls != null) {<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>        this.rpcCallsHistogram.update(rpcCalls.longValue());<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>      }<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      if (remoteRpcCalls != null) {<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (millisBetweenNext != null) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>      }<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>      if (regionsScanned != null) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>        this.regionsScannedHistogram.update(regionsScanned.longValue());<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>      }<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>        this.bytesInResultsHistogram.update(bytesInResults.longValue());<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      }<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span><a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    String generateStatus(final int sr, final int i, final int lr) {<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>      return sr + "/" + i + "/" + lr + ", latency " + getShortLatencyReport() +<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>        (!isRandomValueSize()? "": ", value size " + getShortValueSizeReport());<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span><a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    boolean isRandomValueSize() {<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>      return opts.valueRandom;<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    }<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span><a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    protected int getReportingPeriod() {<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>      return opts.period;<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span>    }<a name="line.1151"></a>
+<span class="sourceLineNo">1152</span><a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    /**<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>     */<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    public Histogram getLatencyHistogram() {<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>      return latencyHistogram;<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    }<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span><a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    void testSetup() throws IOException {<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      // test metrics<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      // scan metrics<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      millisBetweenNextHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>      bytesInRemoteResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span><a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>      createConnection();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>      onStartup();<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    }<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span><a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    abstract void createConnection() throws IOException;<a name="line.1176"></a>
 <span class="sourceLineNo">1177</span><a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    int getStartRow() {<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>      return opts.startRow;<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span><a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    int getLastRow() {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    /**<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>     */<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>      int startRow = getStartRow();<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      int lastRow = getLastRow();<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>      TraceUtil.addSampler(traceSampler);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>      // Report on completion of 1/10th of total.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (i % everyN != 0) continue;<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          long startTime = System.nanoTime();<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            testRow(i);<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>          }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>            }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            }<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>      }<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    /**<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>     * @return Subset of the histograms' calculation.<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     */<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>    public String getShortLatencyReport() {<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1221"></a>
+<span class="sourceLineNo">1178</span>    abstract void onStartup() throws IOException;<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    void testTakedown() throws IOException {<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>      onTakedown();<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>      // Print all stats for this thread continuously.<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>      // Synchronize on Test.class so different threads don't intermingle the<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>      // output. We can't use 'this' here because each thread has its own instance of Test class.<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>      synchronized (Test.class) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>        status.setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>            latencyHistogram));<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>        status.setStatus("ValueSize (bytes) : "<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>        status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>        if (rpcCallsHistogram.getCount() &gt; 0) {<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          status.setStatus("rpcCalls (count): " +<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>              YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        }<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>        if (remoteRpcCallsHistogram.getCount() &gt; 0) {<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          status.setStatus("remoteRpcCalls (count): " +<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>              YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        if (millisBetweenNextHistogram.getCount() &gt; 0) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          status.setStatus("millisBetweenNext (latency): " +<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>        }<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>        if (regionsScannedHistogram.getCount() &gt; 0) {<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          status.setStatus("regionsScanned (count): " +<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>              YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>        }<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>        if (bytesInResultsHistogram.getCount() &gt; 0) {<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          status.setStatus("bytesInResults (size): " +<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>              YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>        }<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>          status.setStatus("bytesInRemoteResults (size): " +<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>              YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>        }<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>      }<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      closeConnection();<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      receiverHost.closeReceivers();<a name="line.1221"></a>
 <span class="sourceLineNo">1222</span>    }<a name="line.1222"></a>
 <span class="sourceLineNo">1223</span><a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    /**<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>     * @return Subset of the histograms' calculation.<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    public String getShortValueSizeReport() {<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    }<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    /*<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    * Test for individual row.<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    * @param i Row index.<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    */<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>  }<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span><a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>  static abstract class Test extends TestBase {<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    protected Connection connection;<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      this.connection = con;<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    @Override<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    void createConnection() throws IOException {<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      if (!opts.isOneCon()) {<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
+<span class="sourceLineNo">1224</span>    abstract void onTakedown() throws IOException;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span><a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>    abstract void closeConnection() throws IOException;<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span><a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    /*<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>     * Run test<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>     * @return Elapsed time.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>     * @throws IOException<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>     */<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    long test() throws IOException, InterruptedException {<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      testSetup();<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      final long startTime = System.nanoTime();<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      try {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>        testTimed();<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      } finally {<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>        testTakedown();<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      }<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>      return (System.nanoTime() - startTime) / 1000000;<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    }<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span><a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    int getStartRow() {<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      return opts.startRow;<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    }<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span><a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>    int getLastRow() {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>      return getStartRow() + opts.perClientRunRows;<a name="line.1250"></a>
 <span class="sourceLineNo">1251</span>    }<a name="line.1251"></a>
 <span class="sourceLineNo">1252</span><a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    @Override<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    void closeConnection() throws IOException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      if (!opts.isOneCon()) {<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        this.connection.close();<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      }<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>    }<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>  }<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span><a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>  static abstract class AsyncTest extends TestBase {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    protected AsyncConnection connection;<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span><a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>      this.connection = con;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span><a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    @Override<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    void createConnection() {<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>      if (!opts.isOneCon()) {<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>        try {<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>          LOG.error("Failed to create async connection", e);<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        }<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>      }<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    }<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span><a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    @Override<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    void closeConnection() throws IOException {<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      if (!opts.isOneCon()) {<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>        this.connection.close();<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      }<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    }<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>  }<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>  static abstract class TableTest extends Test {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    protected Table table;<a name="line.1289"></a>
+<span class="sourceLineNo">1253</span>    /**<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>     * Provides an extension point for tests that don't want a per row invocation.<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>     */<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    void testTimed() throws IOException, InterruptedException {<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>      int startRow = getStartRow();<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      int lastRow = getLastRow();<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>      TraceUtil.addSampler(traceSampler);<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>      // Report on completion of 1/10th of total.<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      for (int ii = 0; ii &lt; opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>        for (int i = startRow; i &lt; lastRow; i++) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>          if (i % everyN != 0) continue;<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>          long startTime = System.nanoTime();<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>          try (TraceScope scope = TraceUtil.createTrace("test row")){<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>            testRow(i);<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          }<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          if ( (i - startRow) &gt; opts.measureAfter) {<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>            // If multiget is enabled, say set to 10, testRow() returns immediately first 9 times<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>            // and sends the actual get request in the 10th iteration. We should only set latency<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>            // when actual request is sent because otherwise it turns out to be 0.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>            if (opts.multiGet == 0 || (i - startRow + 1) % opts.multiGet == 0) {<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>              latencyHistogram.update((System.nanoTime() - startTime) / 1000);<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>            }<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>              status.setStatus(generateStatus(startRow, i, lastRow));<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>            }<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>          }<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>        }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      }<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    }<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span><a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    /**<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>     * @return Subset of the histograms' calculation.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>     */<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    public String getShortLatencyReport() {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    }<a name="line.1289"></a>
 <span class="sourceLineNo">1290</span><a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      super(con, options, status);<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    @Override<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>    void onStartup() throws IOException {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>    }<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span><a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>    @Override<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    void onTakedown() throws IOException {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>      table.close();<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>    }<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>  }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span><a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span><a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      super(con, options, status);<a name="line.1310"></a>
+<span class="sourceLineNo">1291</span>    /**<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>     * @return Subset of the histograms' calculation.<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>     */<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    public String getShortValueSizeReport() {<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    }<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span><a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>    /*<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>    * Test for individual row.<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    * @param i Row index.<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    */<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>    abstract void testRow(final int i) throws IOException, InterruptedException;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>  }<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>  static abstract class Test extends TestBase {<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    protected Connection connection;<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span><a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>    Test(final Connection con, final TestOptions options, final Status status) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>      this.connection = con;<a name="line.1310"></a>
 <span class="sourceLineNo">1311</span>    }<a name="line.1311"></a>
 <span class="sourceLineNo">1312</span><a name="line.1312"></a>
 <span class="sourceLineNo">1313</span>    @Override<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    void onStartup() throws IOException {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    }<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    @Override<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    void onTakedown() throws IOException {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    }<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>  }<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span><a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>  static class AsyncRandomReadTest extends AsyncTableTest {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    private final Consistency consistency;<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>    private ArrayList&lt;Get&gt; gets;<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    private Random rd = new Random();<a name="line.1326"></a>
+<span class="sourceLineNo">1314</span>    void createConnection() throws IOException {<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>      if (!opts.isOneCon()) {<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        this.connection = ConnectionFactory.createConnection(conf);<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>      }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>    }<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span><a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    @Override<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    void closeConnection() throws IOException {<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      if (!opts.isOneCon()) {<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>        this.connection.close();<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      }<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>  }<a name="line.1326"></a>
 <span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>      super(con, options, status);<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      if (opts.multiGet &gt; 0) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>        this.gets = new ArrayList&lt;&gt;(opts.multiGet);<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>      }<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span><a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    @Override<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>      if (opts.randomSleep &gt; 0) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>        Thread.sleep(rd.nextInt(opts.randomSleep));<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>      }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>      Get get = new Get(getRandomRow(this.rand, opts.totalRows));<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>      if (opts.addColumns) {<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>        get.addColumn(FAMILY_NAME, QUALIFIER_NAME);<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>      } else {<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>        get.addFamily(FAMILY_NAME);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>      }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>      if (opts.filterAll) {<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>        get.setFilter(new FilterAllFilter());<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>      }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>      get.setConsistency(consistency);<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      if (LOG.isTraceEnabled()) LOG.trace(get.toString());<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>      try {<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>        if (opts.multiGet &gt; 0) {<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>          this.gets.add(get);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>          if (this.gets.size() == opts.multiGet) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>            Result[] rs =<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>                this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>            updateValueSize(rs);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>            this.gets.clear();<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          }<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        } else {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>          updateValueSize(this.table.get(get).get());<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>        }<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>      } catch (ExecutionException e) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>        throw new IOException(e);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>      }<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span><a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    public static RuntimeException runtime(Throwable e) {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      if (e instanceof RuntimeException) {<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>        return (RuntimeException) e;<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>      }<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      return new RuntimeException(e);<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    }<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>      try {<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>        return callable.call();<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      } catch (Exception e) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>        throw runtime(e);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>      }<a name="line.1382"></a>
+<span class="sourceLineNo">1328</span>  static abstract class AsyncTest extends TestBase {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    protected AsyncConnection connection;<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span><a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      this.connection = con;<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span><a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    @Override<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    void createConnection() {<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      if (!opts.isOneCon()) {<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>        try {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>          this.connection = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        } catch (InterruptedException | ExecutionException e) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          LOG.error("Failed to create async connection", e);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span><a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    @Override<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    void closeConnection() throws IOException {<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>      if (!opts.isOneCon()) {<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>        this.connection.close();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>      }<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    }<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>  }<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span><a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>  static abstract class TableTest extends Test {<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    protected Table table;<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span><a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    TableTest(Connection con, TestOptions options, Status status) {<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>      super(con, options, status);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    }<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span><a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    @Override<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    void onStartup() throws IOException {<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    }<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span><a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    @Override<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    void onTakedown() throws IOException {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      table.close();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    }<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>  }<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span><a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>  static abstract class AsyncTableTest extends AsyncTest {<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    protected AsyncTable&lt;?&gt; table;<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span><a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      super(con, options, status);<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>    @Override<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    void onStartup() throws IOException {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>      this.table = connection.getTable(TableName.valueOf(opts.tableName));<a name="line.1382"></a>
 <span class="sourceLineNo">1383</span>    }<a name="line.1383"></a>
 <span class="sourceLineNo">1384</span><a name="line.1384"></a>
 <span class="sourceLineNo">1385</span>    @Override<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    protected int getReportingPeriod() {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>      int period = opts.perClientRunRows / 10;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      return period == 0 ? opts.perClientRunRows : period;<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>    }<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span><a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>    @Override<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    protected void testTakedown() throws IOException {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        this.table.get(gets);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>        this.gets.clear();<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>      }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      super.testTakedown();<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  }<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span><a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>  static class AsyncRandomWriteTest extends AsyncTableTest {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      super(con, options, status);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    @Override<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    void testRow(final int i) throws IOException, InterruptedException {<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      byte[] row = getRandomRow(this.rand, opts.totalRows);<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Put put = new Put(row);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>      for (int column = 0; column &lt; opts.columns; column++) {<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>        byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        byte[] value = generateData(this.rand, getValueLength(this.rand));<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>        if (opts.useTags) {<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>          byte[] tag = generateData(this.rand, TAG_LENGTH);<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>          Tag[] tags = new Tag[opts.noOfTags];<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>          for (int n = 0; n &lt; opts.noOfTags; n++) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>            Tag t = new ArrayBackedTag((byte) n, tag);<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>            tags[n] = t;<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>          }<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>          KeyValue kv =<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>              new KeyValue(row, FAMILY_NAME, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          put.add(kv);<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>          updateValueSize(kv.getValueLength());<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        } else {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          put.addColumn(FAMILY_NAME, qualifier, value);<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>          updateValueSize(value.length);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        }<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      try {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        table.put(put).get();<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>      } catch (ExecutionException e) {<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        throw new IOException(e);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>      }<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    }<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>  }<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span><a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>  static class AsyncScanTest extends AsyncTableTest {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    private ResultScanner testScanner;<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    private AsyncTable&lt;?&gt; asyncTable;<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span><a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      super(con, options, status);<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    }<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span><a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    @Override<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    void onStartup() throws IOException {<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      this.asyncTable =<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          connection.getTable(TableName.valueOf(opts.tableName),<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>    }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span><a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    @Override<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    void testTakedown() throws IOException {<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      if (this.testScanne

<TRUNCATED>

[35/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/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 54e6ab2..ccc5090 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.1694">PerformanceEvaluation.RandomReadTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1785">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>
@@ -247,7 +247,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">i
 sRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">i
 sRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1695">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.1786">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.1696">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.1787">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.1697">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.1788">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.1699">RandomReadTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1790">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.1709">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1800">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.1737">getReportingPeriod</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1831">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.1743">testTakedown</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1837">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/f2065178/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 8751ac6..c96d41e 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.1683">PerformanceEvaluation.RandomScanWithRange10000Test</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1774">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>
@@ -232,7 +232,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Rando
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">i
 sRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">i
 sRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updat
 eValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1684">RandomScanWithRange10000Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html#line.1775">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.1689">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.1780">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/f2065178/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 8e593cb..c921c32 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.1672">PerformanceEvaluation.RandomScanWithRange1000Test</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1763">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>
@@ -232,7 +232,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Rando
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">i
 sRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">i
 sRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updat
 eValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1673">RandomScanWithRange1000Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html#line.1764">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.1678">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.1769">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/f2065178/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 f188ebc..a04458c 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.1661">PerformanceEvaluation.RandomScanWithRange100Test</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1752">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>
@@ -232,7 +232,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Rando
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">i
 sRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">i
 sRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updat
 eValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1662">RandomScanWithRange100Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html#line.1753">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.1667">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.1758">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/f2065178/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 6abac16..f6093a9 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.1650">PerformanceEvaluation.RandomScanWithRange10Test</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1741">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>
@@ -232,7 +232,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Rando
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">i
 sRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">i
 sRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updat
 eValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1651">RandomScanWithRange10Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html#line.1742">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.1656">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.1747">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/f2065178/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 d5708fa..15efda4 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.1599">PerformanceEvaluation.RandomScanWithRangeTest</a>
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1684">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>
@@ -236,7 +236,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">i
 sRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">i
 sRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updat
 eValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1600">RandomScanWithRangeTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1685">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.1605">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1690">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.1635">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.1726">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.1637">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.1728">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.1644">getReportingPeriod</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1735">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/f2065178/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 f9a03d5..904e594 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.1563">PerformanceEvaluation.RandomSeekScanTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1640">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>
@@ -224,7 +224,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">i
 sRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Random-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">i
 sRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updat
 eValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1564">RandomSeekScanTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html#line.1641">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.1569">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html#line.1646">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.1592">getReportingPeriod</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html#line.1677">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/f2065178/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 2e9e23c..83551e7 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.1752">PerformanceEvaluation.RandomWriteTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1846">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>
@@ -220,7 +220,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Buffe
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result
 :A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hb
 ase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1753">RandomWriteTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html#line.1847">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.1758">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html#line.1852">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/f2065178/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 e2b96a5..aaf40e1 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.1789">PerformanceEvaluation.ScanTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1883">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>
@@ -235,7 +235,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBas
 e.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1790">testScanner</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.client.ResultScanner <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1884">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.1792">ScanTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1886">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.1797">testTakedown</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1891">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.1806">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1900">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/f2065178/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 58bd1995..704a3c4 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.1938">PerformanceEvaluation.SequentialReadTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2035">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>
@@ -220,7 +220,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></h3>
-<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result
 :A-">updateValueSize</a></code></li>
+<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#generateStatus-int-int-int-">generateStatus</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLatencyHistogram--">getLatencyHistogram</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortLatencyReport--">getShortLatencyReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getShortValueSizeReport--">getShortValueSizeReport</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getValueLength-java.util.Rando
 m-">getValueLength</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#isRandomValueSize--">isRandomValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#test--">test</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testSetup--">testSetup</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTakedown--">testTakedown</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#testTimed--">testTimed</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">updateScanMetrics</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hb
 ase.client.Result-">updateValueSize</a>, <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-org.apache.hadoop.hbase.client.Result:A-">updateValueSize</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -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.1939">SequentialReadTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html#line.2036">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.1944">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html#line.2041">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>


[47/51] [partial] hbase-site git commit: Published site at acd0d1e446c164d9c54bfb461b2d449c8d717c07.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index 5890b1a..9b88fec 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -167,10 +167,10 @@
 <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.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
index ed476e8..e17c4b2 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -550,24 +550,24 @@
 <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.client.<a href="../../../../../org/apache/hadoop/hbase/client/RequestController.ReturnCode.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RequestController.ReturnCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Consistency</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/ScannerCallable.MoreResults.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">ScannerCallable.MoreResults</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcessTask.SubmittedRows.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncProcessTask.SubmittedRows</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncRequestFutureImpl.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncRequestFutureImpl.Retry</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcessTask.SubmittedRows.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncProcessTask.SubmittedRows</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MasterSwitchType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MasterSwitchType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RegionLocateType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AbstractResponse.ResponseType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AbstractResponse.ResponseType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Consistency</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/ScannerCallable.MoreResults.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">ScannerCallable.MoreResults</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Scan.ReadType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RegionLocateType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RequestController.ReturnCode.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RequestController.ReturnCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
index bf0f6e6..62c0444 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
@@ -183,14 +183,14 @@
 <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.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterList.Operator.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterList.Operator</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/CompareFilter.CompareOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">CompareFilter.CompareOp</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
index 63e54e3..c5a6478 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -273,12 +273,12 @@
 <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/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheConfig.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">CacheConfig.ExternalBlockCaches</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">Cacheable.MemoryType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">HFileBlock.Writer.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">Cacheable.MemoryType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
index 6a2998c..a6039ad 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
@@ -349,9 +349,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.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceFactoryImpl.SourceStorage.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">MetricsHBaseServerSourceFactoryImpl.SourceStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
index ad40e69..eb945fb 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
@@ -197,8 +197,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.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.LocalityType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.Action.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.LocalityType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
index ac4b7c0..0185fb6 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -346,11 +346,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.master.<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMasterSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetricsMasterSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.TerminationStatus.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.TerminationStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
index e602642..a7119b7 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -208,9 +208,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.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">ServerProcedureInterface.ServerOperationType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html b/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
index 9eb46aa..3e1ea7f 100644
--- a/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
@@ -125,8 +125,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.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredTask.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/TaskMonitor.TaskFilter.TaskType.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">TaskMonitor.TaskFilter.TaskType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredTask.State</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/package-tree.html b/devapidocs/org/apache/hadoop/hbase/package-tree.html
index e49713c..727b4f2 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -441,18 +441,18 @@
 <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.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterMetrics.Option</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeyValue.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CellBuilderType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CellBuilderType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterMetrics.Option</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CellBuilderType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CellBuilderType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index 422a5fa..b6facd4 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -213,9 +213,9 @@
 <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.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Procedure.LockState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">RootProcedureState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
index bd3f539..f63feb5 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -229,13 +229,13 @@
 <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.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/RpcThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">RpcThrottlingException.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottlingException.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index 2636f5a..2203917 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -704,20 +704,20 @@
 <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/ScannerContext.LimitScope.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.LimitScope</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">HRegion.FlushResult.Result</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.LimitScope.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.LimitScope</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">HRegion.FlushResult.Result</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScanType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
index b377318..2731576 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
@@ -130,9 +130,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.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/StripeCompactionScanQueryMatcher.DropDeletesInOutput.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">StripeCompactionScanQueryMatcher.DropDeletesInOutput</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">ScanQueryMatcher.MatchCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.DeleteResult.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">DeleteTracker.DeleteResult</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/StripeCompactionScanQueryMatcher.DropDeletesInOutput.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">StripeCompactionScanQueryMatcher.DropDeletesInOutput</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
index a4ab1b7..f6fc79b 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
@@ -238,8 +238,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.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogReader.WALHdrResult.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">ProtobufLogReader.WALHdrResult</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
index 193a3a3032..d1e114d 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
@@ -198,8 +198,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.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">ReplicationSourceShipper.WorkerState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceFactoryImpl.SourceHolder.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">MetricsReplicationSourceFactoryImpl.SourceHolder</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">ReplicationSourceShipper.WorkerState</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
index 5a7e325..e0eb9a0 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
@@ -137,8 +137,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.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessControlFilter.Strategy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessControlFilter.Strategy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
index dfa02b5..7ba3a64 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
@@ -191,8 +191,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.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
index 8e41b8e..2b64b99 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
@@ -198,9 +198,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.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftServerRunner.ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftServerRunner.ImplType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftMetrics.ThriftServerType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">MetricsThriftServerSourceFactoryImpl.FactoryStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftServerRunner.ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftServerRunner.ImplType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f2065178/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
index bf2f539..ca7cc25 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -532,14 +532,14 @@
 <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.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/IdReadWriteLock.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLock.ReferenceType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
 </ul>
 </li>
 </ul>