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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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 – 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 –
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 – 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 – 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 – 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 – 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 – 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 –
Apache HBase (TM) Metrics
@@ -459,7 +459,7 @@ export HBASE_REGIONSERVER_OPTS="$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 –
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 – 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 – 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 – 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 – 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 – 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 – 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 –
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 –
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 – 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 – 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 – 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 – 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 – 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> </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> </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> </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> </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> </dd>
</dl>
@@ -24843,6 +24847,8 @@
<dd> </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> </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> </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> </dd>
<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestReplicationSyncUpToolWithBulkLoadedData.html#mimicSyncUpAfterBulkLoad-java.util.Iterator-">mimicSyncUpAfterBulkLoad(Iterator<String>)</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> </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> </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> </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> </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> </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> </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> </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> </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> </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<RemoteProcedureDispatcher.RemoteProcedure>)</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> </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> </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<String, String>, 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> </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<String, String>)</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> </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> </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> </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> </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> </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> </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> </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> </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<byte[], MultiResponse.RegionResult>)</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 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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html#line.1967">AppendTest</a>(org.apache.hadoop.hbase.client.Connection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html#line.1875">testRow</a>(int i)
+<pre>void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html#line.1972">testRow</a>(int 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 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 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 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 <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><org.apache.hadoop.hbase.client.Get> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1325">gets</a></pre>
+<pre>private <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><org.apache.hadoop.hbase.client.Get> <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 <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 <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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1395">AsyncRandomReadTest</a>(org.apache.hadoop.hbase.client.AsyncConnection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1338">testRow</a>(int i)
+<pre>void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1405">testRow</a>(int 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 <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> <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> e)</pre>
+<pre>public static <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> <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> 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 <V> V <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><V> callable)</pre>
+<pre>public static <V> V <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><V> 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 int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1386">getReportingPeriod</a>()</pre>
+<pre>protected int <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> in class <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 void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1392">testTakedown</a>()
+<pre>protected void <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 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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html#line.1472">AsyncRandomWriteTest</a>(org.apache.hadoop.hbase.client.AsyncConnection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html#line.1407">testRow</a>(int i)
+<pre>void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html#line.1477">testRow</a>(int 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 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 org.apache.hadoop.hbase.client.ResultScanner <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1439">testScanner</a></pre>
+<pre>private 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 org.apache.hadoop.hbase.client.AsyncTable<?> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1440">asyncTable</a></pre>
+<pre>private org.apache.hadoop.hbase.client.AsyncTable<?> <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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1512">AsyncScanTest</a>(org.apache.hadoop.hbase.client.AsyncConnection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1447">onStartup</a>()
+<pre>void <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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1454">testTakedown</a>()
+<pre>void <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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1462">testRow</a>(int i)
+<pre>void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1533">testRow</a>(int 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 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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html#line.1558">AsyncSequentialReadTest</a>(org.apache.hadoop.hbase.client.AsyncConnection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html#line.1489">testRow</a>(int i)
+<pre>void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html#line.1563">testRow</a>(int 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<RegionInfo, ServerName> 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<RegionInfo, ServerName> regions = new TreeMap<>();<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 &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 <code>hbase:meta</code> 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<RegionInfo, ServerName> 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<RegionInfo, ServerName> regions = new TreeMap<>();<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 &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 <code>hbase:meta</code> 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 <code>hbase:meta</code> 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 <code>hbase:meta</code> 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<Result> 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 <code>hbase:meta</code> 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<Result> 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 <code>hbase:meta</code> 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 <code>hbase:meta</code>.<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<Result> 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 <code>hbase:meta</code><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 <code>regionName</code><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<RegionInfo, ServerName> 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<>(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 > 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<RegionInfo, RegionInfo> 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 && 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<>(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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> 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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> getListOfRegionInfos(<a name="line.465"></a>
-<span class="sourceLineNo">466</span> final List<Pair<RegionInfo, ServerName>> 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<RegionInfo> result = new ArrayList<>(pairs.size());<a name="line.470"></a>
-<span class="sourceLineNo">471</span> for (Pair<RegionInfo, ServerName> 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 <code>hbase:meta</code>.<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<Result> 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 <code>hbase:meta</code><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 <code>regionName</code><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<RegionInfo, ServerName> 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<>(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 > 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<RegionInfo, RegionInfo> 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 && 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<>(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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> 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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> getListOfRegionInfos(<a name="line.455"></a>
+<span class="sourceLineNo">456</span> final List<Pair<RegionInfo, ServerName>> 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<RegionInfo> result = new ArrayList<>(pairs.size());<a name="line.460"></a>
+<span class="sourceLineNo">461</span> for (Pair<RegionInfo, ServerName> 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 > 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<Pair<RegionInfo, ServerName>><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<Pair<RegionInfo, ServerName>> 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 && 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<Pair<RegionInfo, ServerName>> visitor =<a name="line.594"></a>
-<span class="sourceLineNo">595</span> new CollectingVisitor<Pair<RegionInfo, ServerName>>() {<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 && 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<>(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<RegionInfo, Result><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<RegionInfo, Result> hris = new TreeMap<>();<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<Result> v = new CollectingVisitor<Result>() {<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 && 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<RegionInfo, ServerName> 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<RegionInfo, ServerName> regions = new TreeMap<>();<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 &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 <code>hbase:meta</code> 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<RegionInfo, ServerName> 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<RegionInfo, ServerName> regions = new TreeMap<>();<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 &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 <code>hbase:meta</code> 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 <code>hbase:meta</code> 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 <code>hbase:meta</code> 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<Result> 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 <code>hbase:meta</code> 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<Result> 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 <code>hbase:meta</code> 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 <code>hbase:meta</code>.<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<Result> 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 <code>hbase:meta</code><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 <code>regionName</code><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<RegionInfo, ServerName> 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<>(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 > 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<RegionInfo, RegionInfo> 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 && 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<>(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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> 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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> getListOfRegionInfos(<a name="line.465"></a>
-<span class="sourceLineNo">466</span> final List<Pair<RegionInfo, ServerName>> 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<RegionInfo> result = new ArrayList<>(pairs.size());<a name="line.470"></a>
-<span class="sourceLineNo">471</span> for (Pair<RegionInfo, ServerName> 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 <code>hbase:meta</code>.<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<Result> 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 <code>hbase:meta</code><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 <code>regionName</code><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<RegionInfo, ServerName> 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<>(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 > 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<RegionInfo, RegionInfo> 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 && 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<>(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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> 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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> getListOfRegionInfos(<a name="line.455"></a>
+<span class="sourceLineNo">456</span> final List<Pair<RegionInfo, ServerName>> 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<RegionInfo> result = new ArrayList<>(pairs.size());<a name="line.460"></a>
+<span class="sourceLineNo">461</span> for (Pair<RegionInfo, ServerName> 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 > 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<Pair<RegionInfo, ServerName>><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<Pair<RegionInfo, ServerName>> 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 && 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<Pair<RegionInfo, ServerName>> visitor =<a name="line.594"></a>
-<span class="sourceLineNo">595</span> new CollectingVisitor<Pair<RegionInfo, ServerName>>() {<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 && 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<>(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<RegionInfo, Result><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<RegionInfo, Result> hris = new TreeMap<>();<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<Result> v = new CollectingVisitor<Result>() {<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 && 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 –
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 –
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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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 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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html#line.1583">AsyncSequentialWriteTest</a>(org.apache.hadoop.hbase.client.AsyncConnection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html#line.1511">testRow</a>(int i)
+<pre>void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html#line.1588">testRow</a>(int 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 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 org.apache.hadoop.hbase.client.AsyncTable<?> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html#line.1307">table</a></pre>
+<pre>protected org.apache.hadoop.hbase.client.AsyncTable<?> <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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html#line.1376">AsyncTableTest</a>(org.apache.hadoop.hbase.client.AsyncConnection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html#line.1314">onStartup</a>()
+<pre>void <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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html#line.1319">onTakedown</a>()
+<pre>void <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 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 org.apache.hadoop.hbase.client.AsyncConnection <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html#line.1262">connection</a></pre>
+<pre>protected 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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html#line.1331">AsyncTest</a>(org.apache.hadoop.hbase.client.AsyncConnection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html#line.1270">createConnection</a>()</pre>
+<pre>void <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> in class <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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html#line.1281">closeConnection</a>()
+<pre>void <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 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 org.apache.hadoop.hbase.client.BufferedMutator <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1543">mutator</a></pre>
+<pre>protected 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 org.apache.hadoop.hbase.client.Table <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1544">table</a></pre>
+<pre>protected 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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1623">BufferedMutatorTest</a>(org.apache.hadoop.hbase.client.Connection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1551">onStartup</a>()
+<pre>void <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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1557">onTakedown</a>()
+<pre>void <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 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 byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1835">qualifier</a></pre>
+<pre>private final 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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1933">CASTableTest</a>(org.apache.hadoop.hbase.client.Connection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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[] <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1841">getQualifier</a>()</pre>
+<pre>byte[] <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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1846">getStartRow</a>()</pre>
+<pre>int <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> in class <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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1851">getLastRow</a>()</pre>
+<pre>int <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> in class <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 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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html#line.2017">CheckAndDeleteTest</a>(org.apache.hadoop.hbase.client.Connection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html#line.1925">testRow</a>(int i)
+<pre>void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html#line.2022">testRow</a>(int 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 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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html#line.1981">CheckAndMutateTest</a>(org.apache.hadoop.hbase.client.Connection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html#line.1889">testRow</a>(int i)
+<pre>void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html#line.1986">testRow</a>(int 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 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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html#line.2000">CheckAndPutTest</a>(org.apache.hadoop.hbase.client.Connection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html#line.1908">testRow</a>(int i)
+<pre>void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html#line.2005">testRow</a>(int 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 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 org.slf4j.Logger <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.1994">LOG</a></pre>
+<pre>protected static final 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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.2096">FilteredScanTest</a>(org.apache.hadoop.hbase.client.Connection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.2001">testRow</a>(int i)
+<pre>void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.2101">testRow</a>(int 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 org.apache.hadoop.hbase.client.Scan <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.2015">constructScan</a>(byte[] valuePrefix)
+<pre>protected org.apache.hadoop.hbase.client.Scan <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.2118">constructScan</a>(byte[] 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 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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html#line.1954">IncrementTest</a>(org.apache.hadoop.hbase.client.Connection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html#line.1862">testRow</a>(int i)
+<pre>void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html#line.1959">testRow</a>(int 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<RegionInfo, ServerName> 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<RegionInfo, ServerName> regions = new TreeMap<>();<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 &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 <code>hbase:meta</code> 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<RegionInfo, ServerName> 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<RegionInfo, ServerName> regions = new TreeMap<>();<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 &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 <code>hbase:meta</code> 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 <code>hbase:meta</code> 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 <code>hbase:meta</code> 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<Result> 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 <code>hbase:meta</code> 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<Result> 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 <code>hbase:meta</code> 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 <code>hbase:meta</code>.<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<Result> 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 <code>hbase:meta</code><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 <code>regionName</code><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<RegionInfo, ServerName> 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<>(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 > 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<RegionInfo, RegionInfo> 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 && 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<>(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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> 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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> getListOfRegionInfos(<a name="line.465"></a>
-<span class="sourceLineNo">466</span> final List<Pair<RegionInfo, ServerName>> 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<RegionInfo> result = new ArrayList<>(pairs.size());<a name="line.470"></a>
-<span class="sourceLineNo">471</span> for (Pair<RegionInfo, ServerName> 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 <code>hbase:meta</code>.<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<Result> 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 <code>hbase:meta</code><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 <code>regionName</code><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<RegionInfo, ServerName> 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<>(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 > 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<RegionInfo, RegionInfo> 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 && 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<>(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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> 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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> getListOfRegionInfos(<a name="line.455"></a>
+<span class="sourceLineNo">456</span> final List<Pair<RegionInfo, ServerName>> 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<RegionInfo> result = new ArrayList<>(pairs.size());<a name="line.460"></a>
+<span class="sourceLineNo">461</span> for (Pair<RegionInfo, ServerName> 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 > 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<Pair<RegionInfo, ServerName>><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<Pair<RegionInfo, ServerName>> 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 && 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<Pair<RegionInfo, ServerName>> visitor =<a name="line.594"></a>
-<span class="sourceLineNo">595</span> new CollectingVisitor<Pair<RegionInfo, ServerName>>() {<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 && 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<>(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<RegionInfo, Result><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<RegionInfo, Result> hris = new TreeMap<>();<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<Result> v = new CollectingVisitor<Result>() {<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 && 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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<RegionInfo, ServerName> 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<RegionInfo, ServerName> regions = new TreeMap<>();<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 &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 <code>hbase:meta</code> 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<RegionInfo, ServerName> 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<RegionInfo, ServerName> regions = new TreeMap<>();<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 &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 <code>hbase:meta</code> 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 <code>hbase:meta</code> 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 <code>hbase:meta</code> 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<Result> 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 <code>hbase:meta</code> 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<Result> 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 <code>hbase:meta</code> 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 <code>hbase:meta</code>.<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<Result> 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 <code>hbase:meta</code><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 <code>regionName</code><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<RegionInfo, ServerName> 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<>(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 > 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<RegionInfo, RegionInfo> 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 && 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<>(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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> 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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> getListOfRegionInfos(<a name="line.465"></a>
-<span class="sourceLineNo">466</span> final List<Pair<RegionInfo, ServerName>> 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<RegionInfo> result = new ArrayList<>(pairs.size());<a name="line.470"></a>
-<span class="sourceLineNo">471</span> for (Pair<RegionInfo, ServerName> 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 <code>hbase:meta</code>.<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<Result> 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 <code>hbase:meta</code><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 <code>regionName</code><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<RegionInfo, ServerName> 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<>(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 > 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<RegionInfo, RegionInfo> 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 && 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<>(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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> 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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> getListOfRegionInfos(<a name="line.455"></a>
+<span class="sourceLineNo">456</span> final List<Pair<RegionInfo, ServerName>> 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<RegionInfo> result = new ArrayList<>(pairs.size());<a name="line.460"></a>
+<span class="sourceLineNo">461</span> for (Pair<RegionInfo, ServerName> 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 > 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<Pair<RegionInfo, ServerName>><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<Pair<RegionInfo, ServerName>> 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 && 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<Pair<RegionInfo, ServerName>> visitor =<a name="line.594"></a>
-<span class="sourceLineNo">595</span> new CollectingVisitor<Pair<RegionInfo, ServerName>>() {<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 && 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<>(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<RegionInfo, Result><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<RegionInfo, Result> hris = new TreeMap<>();<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<Result> v = new CollectingVisitor<Result>() {<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 && 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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<RegionInfo, ServerName> 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<RegionInfo, ServerName> regions = new TreeMap<>();<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 &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 <code>hbase:meta</code> 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<RegionInfo, ServerName> 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<RegionInfo, ServerName> regions = new TreeMap<>();<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 &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 <code>hbase:meta</code> 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 <code>hbase:meta</code> 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 <code>hbase:meta</code> 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<Result> 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 <code>hbase:meta</code> 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<Result> 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 <code>hbase:meta</code> 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 <code>hbase:meta</code>.<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<Result> 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 <code>hbase:meta</code><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 <code>regionName</code><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<RegionInfo, ServerName> 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<>(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 > 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<RegionInfo, RegionInfo> 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 && 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<>(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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> 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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> getListOfRegionInfos(<a name="line.465"></a>
-<span class="sourceLineNo">466</span> final List<Pair<RegionInfo, ServerName>> 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<RegionInfo> result = new ArrayList<>(pairs.size());<a name="line.470"></a>
-<span class="sourceLineNo">471</span> for (Pair<RegionInfo, ServerName> 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 <code>hbase:meta</code>.<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<Result> 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 <code>hbase:meta</code><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 <code>regionName</code><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<RegionInfo, ServerName> 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<>(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 > 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<RegionInfo, RegionInfo> 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 && 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<>(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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> 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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> getListOfRegionInfos(<a name="line.455"></a>
+<span class="sourceLineNo">456</span> final List<Pair<RegionInfo, ServerName>> 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<RegionInfo> result = new ArrayList<>(pairs.size());<a name="line.460"></a>
+<span class="sourceLineNo">461</span> for (Pair<RegionInfo, ServerName> 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 > 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<Pair<RegionInfo, ServerName>><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<Pair<RegionInfo, ServerName>> 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 && 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<Pair<RegionInfo, ServerName>> visitor =<a name="line.594"></a>
-<span class="sourceLineNo">595</span> new CollectingVisitor<Pair<RegionInfo, ServerName>>() {<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 && 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<>(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<RegionInfo, Result><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<RegionInfo, Result> hris = new TreeMap<>();<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<Result> v = new CollectingVisitor<Result>() {<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 && 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> </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> </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 > 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> </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> </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> </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 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 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 byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.157">REPLICATION_PARENT_QUALIFIER</a></pre>
+<pre>public static final 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 byte <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.159">ESCAPE_BYTE</a></pre>
+<pre>private static final 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 byte <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.161">SEPARATED_BYTE</a></pre>
+<pre>private static final 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 char <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.212">META_REPLICA_ID_DELIMITER</a></pre>
+<pre>protected static final 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 > 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 <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 <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 <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><<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>> <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> connection,
+public static <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><<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>> <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> connection,
<a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> 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> <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 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/
<ul class="blockList">
<li class="blockList">
<h4>fullScanRegions</h4>
-<pre>public static void <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> connection,
+<pre>public static void <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> connection,
<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html" title="interface in org.apache.hadoop.hbase">MetaTableAccessor.Visitor</a> 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 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/
<ul class="blockList">
<li class="blockList">
<h4>fullScanRegions</h4>
-<pre>public static <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><<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>> <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> connection)
+<pre>public static <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><<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>> <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> 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 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/
<ul class="blockList">
<li class="blockList">
<h4>fullScanTables</h4>
-<pre>public static void <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> connection,
+<pre>public static void <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> connection,
<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html" title="interface in org.apache.hadoop.hbase">MetaTableAccessor.Visitor</a> 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 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/
<ul class="blockList">
<li class="blockList">
<h4>fullScan</h4>
-<pre>public static <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><<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>> <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> connection,
+<pre>public static <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><<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>> <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> connection,
<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase">MetaTableAccessor.QueryType</a> 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 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/
<ul class="blockList">
<li class="blockList">
<h4>getMetaHTable</h4>
-<pre>public static <a href="../../../../org/apache/hadoop/hbase/client/Table.html" title="interface in org.apache.hadoop.hbase.client">Table</a> <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> connection)
+<pre>public static <a href="../../../../org/apache/hadoop/hbase/client/Table.html" title="interface in org.apache.hadoop.hbase.client">Table</a> <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> 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 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/
<ul class="blockList">
<li class="blockList">
<h4>get</h4>
-<pre>private static <a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a> <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> t,
+<pre>private static <a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a> <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> t,
<a href="../../../../org/apache/hadoop/hbase/client/Get.html" title="class in org.apache.hadoop.hbase.client">Get</a> 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 <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 <a href="../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a><<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>> <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> connection,
+public static <a href="../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a><<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>> <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> connection,
byte[] 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> <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 <a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
<ul class="blockList">
<li class="blockList">
<h4>getRegionLocation</h4>
-<pre>public static <a href="../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a> <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> connection,
+<pre>public static <a href="../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a> <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> connection,
byte[] 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 <a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
<ul class="blockList">
<li class="blockList">
<h4>getRegionLocation</h4>
-<pre>public static <a href="../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a> <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> connection,
+<pre>public static <a href="../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a> <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> connection,
<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> 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 <a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
<ul class="blockList">
<li class="blockList">
<h4>getMetaKeyForRegion</h4>
-<pre>public static byte[] <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> regionInfo)</pre>
+<pre>public static byte[] <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> regionInfo)</pre>
<div class="block">Returns the row key to use for this regionInfo</div>
</li>
</ul>
@@ -1376,7 +1363,7 @@ public static <a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
<ul class="blockList">
<li class="blockList">
<h4>parseRegionInfoFromRegionName</h4>
-<pre>public static <a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.359">parseRegionInfoFromRegionName</a>(byte[] regionName)
+<pre>public static <a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.349">parseRegionInfoFromRegionName</a>(byte[] 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 <a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
<ul class="blockList">
<li class="blockList">
<h4>getRegionResult</h4>
-<pre>public static <a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a> <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> connection,
+<pre>public static <a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a> <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> connection,
byte[] 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 <a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
<li class="blockList">
<h4>getRegionsFromMergeQualifier</h4>
<pre>@Nullable
-public static <a href="../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a><<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>> <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> connection,
+public static <a href="../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a><<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>> <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> connection,
byte[] 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 <a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
<ul class="blockList">
<li class="blockList">
<h4>tableExists</h4>
-<pre>public static boolean <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> connection,
+<pre>public static boolean <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> connection,
<a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> 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 <a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
<ul class="blockList">
<li class="blockList">
<h4>getAllRegions</h4>
-<pre>public static <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><<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> <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> connection,
+<pre>public static <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><<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> <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> connection,
boolean 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 <a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
<ul class="blockList">
<li class="blockList">
<h4>getTableRegions</h4>
-<pre>public static <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><<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> <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> connection,
+<pre>public static <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><<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> <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> connection,
<a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> 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 <a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
<ul class="blockList">
<li class="blockList">
<h4>getTableRegions</h4>
-<pre>public static <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><<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> <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> connection,
+<pre>public static <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><<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> <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> connection,
<a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> tableName,
boolean 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 <a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
<ul class="blockList">
<li class="blockList">
<h4>getListOfRegionInfos</h4>
-<pre>private static <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><<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> <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><<a href="../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a><<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>>> pairs)</pre>
+<pre>private static <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><<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> <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><<a href="../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a><<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>>> pairs)</pre>
</li>
</ul>
<a name="getTableStartRowForMeta-org.apache.hadoop.hbase.TableName-org.apache.hadoop.hbase.MetaTableAccessor.QueryType-">
@@ -1533,7 +1520,7 @@ public static <a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
<ul class="blockList">
<li class="blockList">
<h4>getTableStartRowForMeta</h4>
-<pre>public static byte[] <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> tableName,
+<pre>public static byte[] <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> tableName,
<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase">MetaTableAccessor.QueryType</a> type)</pre>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
@@ -1549,7 +1536,7 @@ public static <a href="../../../../org/apache/hadoop/hbase/util/Pair.html"
<ul class="blockList">
<li class="blockList">
<h4>getTableStopRowForMeta</h4>
-<pre>public static byte[] <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> tableName,
+<pre>public static byte[] <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> tableName,
<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase">MetaTableAccessor.QueryType</a> type)</pre>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
@@ -1566,7 +1553,7 @@ public static <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 <a href="../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a> <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> connection,
+public static <a href="../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a> <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> connection,
<a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> tableName)</pre>
<div class="block"><span class="deprecatedLabel">Deprecated.</span> </div>
<div class="block">This method creates a Scan object that will only scan catalog rows that
@@ -1588,7 +1575,7 @@ public static <a href="../../../../org/apache/hadoop/hbase/client/Scan.html
<ul class="blockList">
<li class="blockList">
<h4>getMetaScan</h4>
-<pre>private static <a href="../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a> <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> connection,
+<pre>private static <a href="../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a> <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> connection,
int rowUpperLimit)</pre>
</li>
</ul>
@@ -1598,7 +1585,7 @@ public static <a href="../../../../org/apache/hadoop/hbase/client/Scan.html
<ul class="blockList">
<li class="blockList">
<h4>getTableRegionsAndLocations</h4>
-<pre>public static <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><<a href="../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a><<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>>> <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> connection,
+<pre>public static <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><<a href="../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a><<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>>> <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> connection,
<a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> 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 <a href="../../../../org/apache/hadoop/hbase/client/Scan.html
<ul class="blockList">
<li class="blockList">
<h4>getTableRegionsAndLocations</h4>
-<pre>public static <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><<a href="../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a><<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>>> <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> connection,
+<pre>public static <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><<a href="../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a><<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>>> <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> connection,
@Nullable
<a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> tableName,
boolean excludeOfflinedSplitParents)
@@ -1643,7 +1630,7 @@ public static <a href="../../../../org/apache/hadoop/hbase/client/Scan.html
<ul class="blockList">
<li class="blockList">
<h4>getServerUserRegions</h4>
-<pre>public static <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><<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>> <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> connection,
+<pre>public static <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><<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>> <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> connection,
<a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> 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 <a href="../../../../org/apache/hadoop/hbase/client/Scan.html
<ul class="blockList">
<li class="blockList">
<h4>fullScanMetaAndPrint</h4>
-<pre>public static void <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> connection)
+<pre>public static void <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> 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 <a href="../../../../org/apache/hadoop/hbase/client/Scan.html
<ul class="blockList">
<li class="blockList">
<h4>scanMetaForTableRegions</h4>
-<pre>public static void <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> connection,
+<pre>public static void <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> connection,
<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html" title="interface in org.apache.hadoop.hbase">MetaTableAccessor.Visitor</a> visitor,
<a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> 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 <a href="../../../../org/apache/hadoop/hbase/client/Scan.html
<ul class="blockList">
<li class="blockList">
<h4>scanMeta</h4>
-<pre>public static void <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> connection,
+<pre>public static void <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> connection,
<a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> table,
<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase">MetaTableAccessor.QueryType</a> type,
int maxRows,
@@ -1712,7 +1699,7 @@ public static <a href="../../../../org/apache/hadoop/hbase/client/Scan.html
<ul class="blockList">
<li class="blockList">
<h4>scanMeta</h4>
-<pre>public static void <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> connection,
+<pre>public static void <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> connection,
@Nullable
byte[] startRow,
@Nullable
@@ -1732,7 +1719,7 @@ public static <a href="../../../../org/apache/hadoop/hbase/client/Scan.html
<ul class="blockList">
<li class="blockList">
<h4>scanMeta</h4>
-<pre>public static void <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> connection,
+<pre>public static void <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> connection,
<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.Visitor.html" title="interface in org.apache.hadoop.hbase">MetaTableAccessor.Visitor</a> visitor,
<a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> tableName,
byte[] row,
@@ -1758,7 +1745,7 @@ public static <a href="../../../../org/apache/hadoop/hbase/client/Scan.html
<ul class="blockList">
<li class="blockList">
<h4>scanMeta</h4>
-<pre>public static void <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> connection,
+<pre>public static void <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> connection,
@Nullable
byte[] startRow,
@Nullable
@@ -1789,7 +1776,7 @@ public static <a href="../../../../org/apache/hadoop/hbase/client/Scan.html
<ul class="blockList">
<li class="blockList">
<h4>scanMeta</h4>
-<pre>private static void <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> connection,
+<pre>private static void <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> connection,
@Nullable
byte[] startRow,
@Nullable
@@ -1813,7 +1800,7 @@ public static <a href="../../../../org/apache/hadoop/hbase/client/Scan.html
<li class="blockList">
<h4>getClosestRegionInfo</h4>
<pre>@NonNull
-private static <a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> <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> connection,
+private static <a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> <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> connection,
@NonNull
<a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> tableName,
@NonNull
@@ -1833,7 +1820,7 @@ private static <a href="../../../../org/apache/hadoop/hbase/client/RegionIn
<ul class="blockList">
<li class="blockList">
<h4>getCatalogFamily</h4>
-<pre>private static byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.823">getCatalogFamily</a>()</pre>
+<pre>private static byte[] <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 <a href="../../../../org/apache/hadoop/hbase/client/RegionIn
<ul class="blockList">
<li class="blockList">
<h4>getTableFamily</h4>
-<pre>private static byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.831">getTableFamily</a>()</pre>
+<pre>private static byte[] <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 <a href="../../../../org/apache/hadoop/hbase/client/RegionIn
<ul class="blockList">
<li class="blockList">
<h4>getRegionInfoColumn</h4>
-<pre>private static byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.839">getRegionInfoColumn</a>()</pre>
+<pre>private static byte[] <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 <a href="../../../../org/apache/hadoop/hbase/client/RegionIn
<ul class="blockList">
<li class="blockList">
<h4>getTableStateColumn</h4>
-<pre>private static byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.847">getTableStateColumn</a>()</pre>
+<pre>private static byte[] <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 <a href="../../../../org/apache/hadoop/hbase/client/RegionIn
<ul class="blockList">
<li class="blockList">
<h4>getRegionStateColumn</h4>
-<pre>private static byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.855">getRegionStateColumn</a>()</pre>
+<pre>private static byte[] <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 <a href="../../../../org/apache/hadoop/hbase/client/RegionIn
<ul class="blockList">
<li class="blockList">
<h4>getServerColumn</h4>
-<pre>public static byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.865">getServerColumn</a>(int replicaId)</pre>
+<pre>public static byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.855">getServerColumn</a>(int 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 <a href="../../../../org/apache/hadoop/hbase/client/RegionIn
<ul class="blockList">
<li class="blockList">
<h4>getStartCodeColumn</h4>
-<pre>public static byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.878">getStartCodeColumn</a>(int replicaId)</pre>
+<pre>public static byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.868">getStartCodeColumn</a>(int 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 <a href="../../../../org/apache/hadoop/hbase/client/RegionIn
<ul class="blockList">
<li class="blockList">
<h4>getSeqNumColumn</h4>
-<pre>public static byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.891">getSeqNumColumn</a>(int replicaId)</pre>
+<pre>public static byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.881">getSeqNumColumn</a>(int 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 <a href="../../../../org/apache/hadoop/hbase/client/RegionIn
<ul class="blockList">
<li class="blockList">
<h4>parseReplicaIdFromServerColumn</h4>
-<pre>static int <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.905">parseReplicaIdFromServerColumn</a>(byte[] serverColumn)</pre>
+<pre>static int <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.895">parseReplicaIdFromServerColumn</a>(byte[] 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 <a href="../../../../org/apache/hadoop/hbase/client/RegionIn
<h4>getServerName</h4>
<pre>@Nullable
@InterfaceAudience.Private
-public static <a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <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> r,
+public static <a href="../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <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> r,
int 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 <a href="../../../../org/apache/hadoop/hbase/ServerName.html"
<ul class="blockList">
<li class="blockList">
<h4>getSeqNumDuringOpen</h4>
-<pre>private static long <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> r,
+<pre>private static long <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> r,
int 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 <a href="../../../../org/apache/hadoop/hbase/ServerName.html"
<li class="blockList">
<h4>getRegionLocations</h4>
<pre>@Nullable
-public static <a href="../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a> <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> r)</pre>
+public static <a href="../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a> <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> 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 <a href="../../../../org/apache/hadoop/hbase/RegionLocations.
<ul class="blockList">
<li class="blockList">
<h4>getRegionLocation</h4>
-<pre>private static <a href="../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a> <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> r,
+<pre>private static <a href="../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a> <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> r,
<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> regionInfo,
int replicaId)</pre>
<div class="block">Returns the HRegionLocation parsed from the given meta row Result
@@ -2043,7 +2030,7 @@ public static <a href="../../../../org/apache/hadoop/hbase/RegionLocations.
<ul class="blockList">
<li class="blockList">
<h4>getRegionInfo</h4>
-<pre>public static <a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> <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> data)</pre>
+<pre>public static <a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> <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> 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 <a href="../../../../org/apache/hadoop/hbase/RegionLocations.
<li class="blockList">
<h4>getRegionInfo</h4>
<pre>@Nullable
-private static <a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> <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> r,
+private static <a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> <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> r,
byte[] 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 <a href="../../../../org/apache/hadoop/hbase/client/RegionIn
<ul class="blockList">
<li class="blockList">
<h4>getDaughterRegions</h4>
-<pre>public static <a href="../../../../org/apache/hadoop/hbase/util/PairOfSameType.html" title="class in org.apache.hadoop.hbase.util">PairOfSameType</a><<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> <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> data)</pre>
+<pre>public static <a href="../../../../org/apache/hadoop/hbase/util/PairOfSameType.html" title="class in org.apache.hadoop.hbase.util">PairOfSameType</a><<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> <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> 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 <a href="../../../../org/apache/hadoop/hbase/client/RegionIn
<ul class="blockList">
<li class="blockList">
<h4>getMergeRegions</h4>
-<pre>public static <a href="../../../../org/apache/hadoop/hbase/util/PairOfSameType.html" title="class in org.apache.hadoop.hbase.util">PairOfSameType</a><<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> <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> data)</pre>
+<pre>public static <a href="../../../../org/apache/hadoop/hbase/util/PairOfSameType.html" title="class in org.apache.hadoop.hbase.util">PairOfSameType</a><<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>> <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> 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 <a href="../../../../org/apache/hadoop/hbase/client/RegionIn
<li class="blockList">
<h4>getTableState</h4>
<pre>@Nullable
-public static <a href="../../../../org/apache/hadoop/hbase/client/TableState.html" title="class in org.apache.hadoop.hbase.client">TableState</a> <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> conn,
+public static <a href="../../../../org/apache/hadoop/hbase/client/TableState.html" title="class in org.apache.hadoop.hbase.client">TableState</a> <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> conn,
<a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> 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 <a href="../../../../org/apache/hadoop/hbase/client/TableStat
<ul class="blockList">
<li class="blockList">
<h4>getTableStates</h4>
-<pre>public static <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><<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>> <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> conn)
+<pre>public static <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><<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>> <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> 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 <a href="../../../../org/apache/hadoop/hbase/client/TableStat
<ul class="blockList">
<li class="blockList">
<h4>updateTableState</h4>
-<pre>public static void <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> conn,
+<pre>public static void <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> conn,
<a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> tableName,
<a href="../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client">TableState.State</a> 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 <a href="../../../../org/apache/hadoop/hbase/client/TableStat
<li class="blockList">
<h4>getTableState</h4>
<pre>@Nullable
-public static <a href="../../../../org/apache/hadoop/hbase/client/TableState.html" title="class in org.apache.hadoop.hbase.client">TableState</a> <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> r)
+public static <a href="../../../../org/apache/hadoop/hbase/client/TableState.html" title="class in org.apache.hadoop.hbase.client">TableState</a> <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> 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 <a href="../../../../org/apache/hadoop/hbase/client/TableStat
<ul class="blockList">
<li class="blockList">
<h4>getRegionCount</h4>
-<pre>public static int <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1258">getRegionCount</a>(org.apache.hadoop.conf.Configuration c,
+<pre>public static int <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1248">getRegionCount</a>(org.apache.hadoop.conf.Configuration c,
<a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> 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 <a href="../../../../org/apache/hadoop/hbase/client/TableStat
<ul class="blockList">
<li class="blockList">
<h4>getRegionCount</h4>
-<pre>public static int <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> connection,
+<pre>public static int <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> connection,
<a href="../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> 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 <a href="../../../../org/apache/hadoop/hbase/client/TableStat
<ul class="blockList">
<li class="blockList">
<h4>makePutFromRegionInfo</h4>
-<pre>public static <a href="../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a> <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> regionInfo,
+<pre>public static <a href="../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a> <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> regionInfo,
long 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 <a href="../../../../org/apache/hadoop/hbase/client/TableStat
<ul class="blockList">
<li class="blockList">
<h4>makeDeleteFromRegionInfo</h4>
-<pre>private static <a href="../../../../org/apache/hadoop/hbase/client/Delete.html" title="class in org.apache.hadoop.hbase.client">Delete</a> <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> regionInfo,
+<pre>private static <a href="../../../../org/apache/hadoop/hbase/client/Delete.html" title="class in org.apache.hadoop.hbase.client">Delete</a> <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> regionInfo,
long 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 <a href="../../../../org/apache/hadoop/hbase/client/TableStat
<ul class="blockList">
<li class="blockList">
<h4>addDaughtersToPut</h4>
-<pre>public static <a href="../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a> <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> put,
+<pre>public static <a href="../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a> <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> put,
<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> splitA,
<a href="../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a> 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 <a href="../../../../org/apache/hadoop/hbase/client/TableStat
<ul class="blockList">
<li class="blockList">
<h4>putToMetaTable</h4>
-<pre>private static void <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> connection,
+<pre>private static void <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> connection,
<a href="../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a> 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 <a href="../../../../org/apache/hadoop/hbase/client/TableStat
<ul class="blockList">
<li class="blockList">
<h4>put</h4>
-<pre>private static void <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> t,
+<pre>private static void <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> t,
<a href="../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a> 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 <a href="../../../../org/apache/hadoop/hbase/client/TableStat
<ul class="blockList">
<li class="blockList">
<h4>putsToMetaTable</h4>
-<pre>public static void <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> connection,
+<pre>public static void <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> 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><<a href="../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>> 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 <a href="../../../../org/apache/hadoop/hbase/client/TableStat
<ul class="blockList">
<li class="blockList">
<h4>deleteFromMetaTable</h4>
-<pre>private static void <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> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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<RegionInfo, ServerName> 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<RegionInfo, ServerName> regions = new TreeMap<>();<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 &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 <code>hbase:meta</code> 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<RegionInfo, ServerName> 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<RegionInfo, ServerName> regions = new TreeMap<>();<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 &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 <code>hbase:meta</code> 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 <code>hbase:meta</code> 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 <code>hbase:meta</code> 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<Result> 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 <code>hbase:meta</code> 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<Result> 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 <code>hbase:meta</code> 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 <code>hbase:meta</code>.<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<Result> 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 <code>hbase:meta</code><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 <code>regionName</code><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<RegionInfo, ServerName> 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<>(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 > 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<RegionInfo, RegionInfo> 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 && 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<>(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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> 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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> getListOfRegionInfos(<a name="line.465"></a>
-<span class="sourceLineNo">466</span> final List<Pair<RegionInfo, ServerName>> 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<RegionInfo> result = new ArrayList<>(pairs.size());<a name="line.470"></a>
-<span class="sourceLineNo">471</span> for (Pair<RegionInfo, ServerName> 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 <code>hbase:meta</code>.<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<Result> 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 <code>hbase:meta</code><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 <code>regionName</code><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<RegionInfo, ServerName> 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<>(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 > 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<RegionInfo, RegionInfo> 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 && 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<>(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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> 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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> getListOfRegionInfos(<a name="line.455"></a>
+<span class="sourceLineNo">456</span> final List<Pair<RegionInfo, ServerName>> 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<RegionInfo> result = new ArrayList<>(pairs.size());<a name="line.460"></a>
+<span class="sourceLineNo">461</span> for (Pair<RegionInfo, ServerName> 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 > 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<Pair<RegionInfo, ServerName>><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<Pair<RegionInfo, ServerName>> 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 && 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<Pair<RegionInfo, ServerName>> visitor =<a name="line.594"></a>
-<span class="sourceLineNo">595</span> new CollectingVisitor<Pair<RegionInfo, ServerName>>() {<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 && 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<>(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<RegionInfo, Result><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<RegionInfo, Result> hris = new TreeMap<>();<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<Result> v = new CollectingVisitor<Result>() {<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 && 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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<RegionInfo, ServerName> 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<RegionInfo, ServerName> regions = new TreeMap<>();<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 &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 <code>hbase:meta</code> 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<RegionInfo, ServerName> 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<RegionInfo, ServerName> regions = new TreeMap<>();<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 &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 <code>hbase:meta</code> 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 <code>hbase:meta</code> 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 <code>hbase:meta</code> 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<Result> 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 <code>hbase:meta</code> 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<Result> 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 <code>hbase:meta</code> 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 <code>hbase:meta</code>.<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<Result> 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 <code>hbase:meta</code><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 <code>regionName</code><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<RegionInfo, ServerName> 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<>(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 > 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<RegionInfo, RegionInfo> 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 && 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<>(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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> 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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> getListOfRegionInfos(<a name="line.465"></a>
-<span class="sourceLineNo">466</span> final List<Pair<RegionInfo, ServerName>> 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<RegionInfo> result = new ArrayList<>(pairs.size());<a name="line.470"></a>
-<span class="sourceLineNo">471</span> for (Pair<RegionInfo, ServerName> 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 <code>hbase:meta</code>.<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<Result> 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 <code>hbase:meta</code><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 <code>regionName</code><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<RegionInfo, ServerName> 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<>(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 > 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<RegionInfo, RegionInfo> 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 && 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<>(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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> 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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> getListOfRegionInfos(<a name="line.455"></a>
+<span class="sourceLineNo">456</span> final List<Pair<RegionInfo, ServerName>> 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<RegionInfo> result = new ArrayList<>(pairs.size());<a name="line.460"></a>
+<span class="sourceLineNo">461</span> for (Pair<RegionInfo, ServerName> 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 > 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<Pair<RegionInfo, ServerName>><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<Pair<RegionInfo, ServerName>> 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 && 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<Pair<RegionInfo, ServerName>> visitor =<a name="line.594"></a>
-<span class="sourceLineNo">595</span> new CollectingVisitor<Pair<RegionInfo, ServerName>>() {<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 && 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<>(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<RegionInfo, Result><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<RegionInfo, Result> hris = new TreeMap<>();<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<Result> v = new CollectingVisitor<Result>() {<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 && 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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 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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html#line.2057">SequentialWriteTest</a>(org.apache.hadoop.hbase.client.Connection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html#line.1962">testRow</a>(int i)
+<pre>void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html#line.2062">testRow</a>(int 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 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 org.apache.hadoop.hbase.client.Table <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html#line.1289">table</a></pre>
+<pre>protected 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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html#line.1358">TableTest</a>(org.apache.hadoop.hbase.client.Connection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html#line.1296">onStartup</a>()
+<pre>void <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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html#line.1301">onTakedown</a>()
+<pre>void <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 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 org.apache.hadoop.hbase.client.Connection <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html#line.1239">connection</a></pre>
+<pre>protected 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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html#line.1308">Test</a>(org.apache.hadoop.hbase.client.Connection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html#line.1247">createConnection</a>()
+<pre>void <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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html#line.1254">closeConnection</a>()
+<pre>void <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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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 valueSize)</code> </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 metrics)</code> </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 r)</code> </td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#updateValueSize-int-">updateValueSize</a></span>(int valueSize)</code> </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 r)</code> </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[] rs)</code> </td>
</tr>
</table>
@@ -437,13 +465,67 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
<pre>private 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 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 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 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 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 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 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 <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 <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 conf,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1062">TestBase</a>(org.apache.hadoop.conf.Configuration conf,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 <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> r)</pre>
+<pre>int <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> 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1087">updateValueSize</a>(org.apache.hadoop.hbase.client.Result[] rs)
+<pre>void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1093">updateValueSize</a>(org.apache.hadoop.hbase.client.Result[] 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1092">updateValueSize</a>(org.apache.hadoop.hbase.client.Result r)
+<pre>void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1098">updateValueSize</a>(org.apache.hadoop.hbase.client.Result 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1101">updateValueSize</a>(int valueSize)</pre>
+<pre>void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1107">updateValueSize</a>(int 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1112">updateScanMetrics</a>(org.apache.hadoop.hbase.client.metrics.ScanMetrics 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> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1106">generateStatus</a>(int 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> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1140">generateStatus</a>(int sr,
int i,
int 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1111">isRandomValueSize</a>()</pre>
+<pre>boolean <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 int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1115">getReportingPeriod</a>()</pre>
+<pre>protected int <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 com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1122">getLatencyHistogram</a>()</pre>
+<pre>public com.codahale.metrics.Histogram <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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1126">testSetup</a>()
+<pre>void <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 void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1133">createConnection</a>()
+<pre>abstract void <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 void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1135">onStartup</a>()
+<pre>abstract void <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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1137">testTakedown</a>()
+<pre>void <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 void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1157">onTakedown</a>()
+<pre>abstract void <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 void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1159">closeConnection</a>()
+<pre>abstract void <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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1166">test</a>()
+<pre>long <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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1178">getStartRow</a>()</pre>
+<pre>int <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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1182">getLastRow</a>()</pre>
+<pre>int <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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1189">testTimed</a>()
+<pre>void <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 <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1220">getShortLatencyReport</a>()</pre>
+<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.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 <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1227">getShortValueSizeReport</a>()</pre>
+<pre>public <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.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 void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1235">testRow</a>(int i)
+<pre>abstract void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1302">testRow</a>(int 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> </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> </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> </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> </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> </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> </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> </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 <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 <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 <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 <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 org.slf4j.Logger <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.133">LOG</a></pre>
+<pre>private static final 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 com.fasterxml.jackson.databind.ObjectMapper <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.134">MAPPER</a></pre>
+<pre>private static final 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 <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 <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 byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.140">FAMILY_NAME</a></pre>
+<pre>public static final 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 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 byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.142">QUALIFIER_NAME</a></pre>
+<pre>public static final 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 <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.2043">calculateMbps</a>(int rows,
+<pre>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> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2150">calculateMbps</a>(int rows,
long timeMs,
int valueSize,
int 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 byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2058">format</a>(int number)</pre>
+<pre>public static byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2165">format</a>(int 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 byte[] <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> r,
+<pre>public static byte[] <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> r,
int 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 byte[] <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> random,
+<pre>static byte[] <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> random,
int 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 int <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> random,
+<pre>static int <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> random,
int 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 <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RunResult</a> <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><? extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>> cmd,
+<pre>static <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RunResult</a> <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><? extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>> cmd,
org.apache.hadoop.conf.Configuration conf,
org.apache.hadoop.hbase.client.Connection con,
org.apache.hadoop.hbase.client.AsyncConnection asyncCon,
@@ -1070,7 +1057,7 @@ implements org.apache.hadoop.util.Tool</pre>
<ul class="blockList">
<li class="blockList">
<h4>getAverageValueLength</h4>
-<pre>private static int <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> opts)</pre>
+<pre>private static int <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> 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 void <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><? extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>> cmd,
+<pre>private void <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><? extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>> cmd,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> 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 void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2168">printUsage</a>()</pre>
+<pre>protected void <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 void <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> message)</pre>
+<pre>protected static void <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> 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 void <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> message,
+<pre>protected static void <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> message,
int 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 void <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> className,
+<pre>protected static void <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> 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> 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 <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.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><<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>> args)</pre>
+<pre>static <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.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><<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>> 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 <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2553">calculateRowsAndSize</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> opts)</pre>
+<pre>static <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2660">calculateRowsAndSize</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> 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 int <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> opts)</pre>
+<pre>static int <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> 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 int <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>[] args)
+<pre>public int <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>[] 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 boolean <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> cmd)</pre>
+<pre>private static boolean <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> 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 <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><? extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>> <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> cmd)</pre>
+<pre>private static <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><? extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>> <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> 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 void <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>[] args)
+<pre>public static void <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>[] 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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>©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 –
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 – 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 – 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 – 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 – 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 static final <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 static final <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 static final <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> </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> </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> </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> </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><<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>></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 <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> r)</pre>
+<pre>void <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> 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> in class <code><a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html" title="class in org.apache.hadoop.hbase">MetaTableAccessor.CollectingVisitor</a><<a href="../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>></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><T>
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.html#line.1158">MetaTableAccessor.CollectingVisitor</a><T>
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 <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><<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html" title="type parameter in MetaTableAccessor.CollectingVisitor">T</a>> <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html#line.1169">results</a></pre>
+<pre>final <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><<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html" title="type parameter in MetaTableAccessor.CollectingVisitor">T</a>> <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 boolean <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> r)
+<pre>public boolean <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> 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: <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 void <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> r)</pre>
+<pre>abstract void <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> 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><<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html" title="type parameter in MetaTableAccessor.CollectingVisitor">T</a>> <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><<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.CollectingVisitor.html" title="type parameter in MetaTableAccessor.CollectingVisitor">T</a>> <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 <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.DefaultVisitorBase.html#line.1204">DefaultVisitorBase</a>()</pre>
+<pre>public <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 boolean <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> rowResult)
+<pre>public abstract boolean <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> 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 boolean <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> rowResult)
+<pre>public boolean <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> 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: <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><<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase">MetaTableAccessor.QueryType</a>></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 <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 <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 <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 <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 <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 <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 <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 <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 byte[][] <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html#line.200">families</a></pre>
+<pre>private final 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 <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.194">values</a>()</pre>
+<pre>public static <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.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 <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.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> name)</pre>
+<pre>public static <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.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> 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[][] <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html#line.206">getFamilies</a>()</pre>
+<pre>byte[][] <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 long[] <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html#line.2023">barriers</a></pre>
+<pre>private final 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 <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 <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 <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><byte[]> <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html#line.2025">parentRegionNames</a></pre>
+<pre>private final <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><byte[]> <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 <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html#line.2027">ReplicationBarrierResult</a>(long[] barriers,
+<pre>public <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html#line.2017">ReplicationBarrierResult</a>(long[] barriers,
<a href="../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master">RegionState.State</a> 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><byte[]> 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 long[] <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html#line.2033">getBarriers</a>()</pre>
+<pre>public long[] <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 <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.2037">getState</a>()</pre>
+<pre>public <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.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 <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><byte[]> <a href="../../../../src-html/org/apache/hadoop/hbase/MetaTableAccessor.ReplicationBarrierResult.html#line.2041">getParentRegionNames</a>()</pre>
+<pre>public <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><byte[]> <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 <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/MetaTableAccessor.ReplicationBarrierResult.html#line.2046">toString</a>()</pre>
+<pre>public <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/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> in class <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 <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 <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 <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> tableName)</pre>
+<pre>public <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> 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 boolean <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> rowResult)
+<pre>public final boolean <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> 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: <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 <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> r)
+<pre>boolean <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> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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<RegionInfo, ServerName> 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<RegionInfo, ServerName> regions = new TreeMap<>();<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 &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 <code>hbase:meta</code> 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<RegionInfo, ServerName> 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<RegionInfo, ServerName> regions = new TreeMap<>();<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 &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 <code>hbase:meta</code> 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 <code>hbase:meta</code> 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 <code>hbase:meta</code> 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<Result> 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 <code>hbase:meta</code> 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<Result> 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 <code>hbase:meta</code> 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 <code>hbase:meta</code>.<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<Result> 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 <code>hbase:meta</code><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 <code>regionName</code><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<RegionInfo, ServerName> 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<>(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 > 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<RegionInfo, RegionInfo> 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 && 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<>(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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> 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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> getListOfRegionInfos(<a name="line.465"></a>
-<span class="sourceLineNo">466</span> final List<Pair<RegionInfo, ServerName>> 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<RegionInfo> result = new ArrayList<>(pairs.size());<a name="line.470"></a>
-<span class="sourceLineNo">471</span> for (Pair<RegionInfo, ServerName> 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 <code>hbase:meta</code>.<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<Result> 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 <code>hbase:meta</code><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 <code>regionName</code><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<RegionInfo, ServerName> 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<>(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 > 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<RegionInfo, RegionInfo> 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 && 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<>(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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> 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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> getListOfRegionInfos(<a name="line.455"></a>
+<span class="sourceLineNo">456</span> final List<Pair<RegionInfo, ServerName>> 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<RegionInfo> result = new ArrayList<>(pairs.size());<a name="line.460"></a>
+<span class="sourceLineNo">461</span> for (Pair<RegionInfo, ServerName> 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 > 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<Pair<RegionInfo, ServerName>><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<Pair<RegionInfo, ServerName>> 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 && 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<Pair<RegionInfo, ServerName>> visitor =<a name="line.594"></a>
-<span class="sourceLineNo">595</span> new CollectingVisitor<Pair<RegionInfo, ServerName>>() {<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 && 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<>(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<RegionInfo, Result><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<RegionInfo, Result> hris = new TreeMap<>();<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<Result> v = new CollectingVisitor<Result>() {<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 && 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 – 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="" /> 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>"2"</tt></li></ul></td>
-<td>783</td>
+<td>797</td>
<td><img src="images/icon_error_sml.gif" alt="" /> 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="" /> Error</td></tr>
<tr class="a">
<td>misc</td>
@@ -10345,7 +10345,7 @@
<ul>
<li>max: <tt>"100"</tt></li>
<li>ignorePattern: <tt>"^package.*|^import.*|a href|href|http://|https://|ftp://|org.apache.thrift.|com.google.protobuf.|hbase.protobuf.generated"</tt></li></ul></td>
-<td>1613</td>
+<td>1615</td>
<td><img src="images/icon_error_sml.gif" alt="" /> Error</td></tr>
<tr class="b">
<td></td>
@@ -14536,7 +14536,7 @@
<tr class="b">
<td><img src="images/icon_error_sml.gif" alt="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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 '<code>\n * List<Future<' 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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="" /> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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<RegionInfo, ServerName> 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<RegionInfo, ServerName> regions = new TreeMap<>();<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 &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 <code>hbase:meta</code> 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<RegionInfo, ServerName> 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<RegionInfo, ServerName> regions = new TreeMap<>();<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 &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 <code>hbase:meta</code> 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 <code>hbase:meta</code> 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 <code>hbase:meta</code> 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<Result> 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 <code>hbase:meta</code> 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<Result> 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 <code>hbase:meta</code> 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 <code>hbase:meta</code>.<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<Result> 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 <code>hbase:meta</code><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 <code>regionName</code><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<RegionInfo, ServerName> 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<>(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 > 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<RegionInfo, RegionInfo> 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 && 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<>(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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> 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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> getListOfRegionInfos(<a name="line.465"></a>
-<span class="sourceLineNo">466</span> final List<Pair<RegionInfo, ServerName>> 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<RegionInfo> result = new ArrayList<>(pairs.size());<a name="line.470"></a>
-<span class="sourceLineNo">471</span> for (Pair<RegionInfo, ServerName> 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 <code>hbase:meta</code>.<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<Result> 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 <code>hbase:meta</code><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 <code>regionName</code><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<RegionInfo, ServerName> 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<>(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 > 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<RegionInfo, RegionInfo> 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 && 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<>(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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> 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<RegionInfo> 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<Pair<RegionInfo, ServerName>> 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<RegionInfo> getListOfRegionInfos(<a name="line.455"></a>
+<span class="sourceLineNo">456</span> final List<Pair<RegionInfo, ServerName>> 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<RegionInfo> result = new ArrayList<>(pairs.size());<a name="line.460"></a>
+<span class="sourceLineNo">461</span> for (Pair<RegionInfo, ServerName> 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 > 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<Pair<RegionInfo, ServerName>><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<Pair<RegionInfo, ServerName>> 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 && 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<Pair<RegionInfo, ServerName>> visitor =<a name="line.594"></a>
-<span class="sourceLineNo">595</span> new CollectingVisitor<Pair<RegionInfo, ServerName>>() {<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 && 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<>(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<RegionInfo, Result><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<RegionInfo, Result> hris = new TreeMap<>();<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<Result> v = new CollectingVisitor<Result>() {<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 && 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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> * <p>This class sets up and runs the evaluation programs described in<a name="line.119"></a>
-<span class="sourceLineNo">120</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.120"></a>
-<span class="sourceLineNo">121</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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> * <p>This class sets up and runs the evaluation programs described in<a name="line.120"></a>
+<span class="sourceLineNo">121</span> * Section 7, <i>Performance Evaluation</i>, of the <a<a name="line.121"></a>
+<span class="sourceLineNo">122</span> * href="http://labs.google.com/papers/bigtable.html">Bigtable</a><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> * <p>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 >= 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 > 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 >= 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 > 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<String,Long> 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 && bytesInResults.longValue() > 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 && bytesInRemoteResults.longValue() > 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 < opts.cycles; ii++) {<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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() > 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() > 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() > 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() > 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() > 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() > 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 < opts.cycles; ii++) {<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span> if (opts.cycles > 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span> for (int i = startRow; i < 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) > 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 && i > 0 && (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<?> 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<Get> 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 > 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<>(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 > 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 > 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 -> 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 <V> V propagate(Callable<V> 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<?> 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 && this.gets.size() > 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 < 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 < 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<?> 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 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 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 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 <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><org.apache.hadoop.hbase.client.Get> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1696">gets</a></pre>
+<pre>private <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><org.apache.hadoop.hbase.client.Get> <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 <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 <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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1790">RandomReadTest</a>(org.apache.hadoop.hbase.client.Connection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1709">testRow</a>(int i)
+<pre>void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1800">testRow</a>(int 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 int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1737">getReportingPeriod</a>()</pre>
+<pre>protected int <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> in class <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 void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1743">testTakedown</a>()
+<pre>protected void <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 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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html#line.1775">RandomScanWithRange10000Test</a>(org.apache.hadoop.hbase.client.Connection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 org.apache.hadoop.hbase.util.Pair<byte[],byte[]> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html#line.1689">getStartAndStopRow</a>()</pre>
+<pre>protected org.apache.hadoop.hbase.util.Pair<byte[],byte[]> <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> in class <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 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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html#line.1764">RandomScanWithRange1000Test</a>(org.apache.hadoop.hbase.client.Connection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 org.apache.hadoop.hbase.util.Pair<byte[],byte[]> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html#line.1678">getStartAndStopRow</a>()</pre>
+<pre>protected org.apache.hadoop.hbase.util.Pair<byte[],byte[]> <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> in class <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 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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html#line.1753">RandomScanWithRange100Test</a>(org.apache.hadoop.hbase.client.Connection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 org.apache.hadoop.hbase.util.Pair<byte[],byte[]> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html#line.1667">getStartAndStopRow</a>()</pre>
+<pre>protected org.apache.hadoop.hbase.util.Pair<byte[],byte[]> <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> in class <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 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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html#line.1742">RandomScanWithRange10Test</a>(org.apache.hadoop.hbase.client.Connection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 org.apache.hadoop.hbase.util.Pair<byte[],byte[]> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html#line.1656">getStartAndStopRow</a>()</pre>
+<pre>protected org.apache.hadoop.hbase.util.Pair<byte[],byte[]> <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> in class <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 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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1685">RandomScanWithRangeTest</a>(org.apache.hadoop.hbase.client.Connection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1605">testRow</a>(int i)
+<pre>void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1690">testRow</a>(int 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 org.apache.hadoop.hbase.util.Pair<byte[],byte[]> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1635">getStartAndStopRow</a>()</pre>
+<pre>protected abstract org.apache.hadoop.hbase.util.Pair<byte[],byte[]> <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 org.apache.hadoop.hbase.util.Pair<byte[],byte[]> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1637">generateStartAndStopRows</a>(int maxRange)</pre>
+<pre>protected org.apache.hadoop.hbase.util.Pair<byte[],byte[]> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1728">generateStartAndStopRows</a>(int 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 int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1644">getReportingPeriod</a>()</pre>
+<pre>protected int <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> in class <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 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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html#line.1641">RandomSeekScanTest</a>(org.apache.hadoop.hbase.client.Connection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html#line.1569">testRow</a>(int i)
+<pre>void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html#line.1646">testRow</a>(int 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 int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html#line.1592">getReportingPeriod</a>()</pre>
+<pre>protected int <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> in class <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 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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html#line.1847">RandomWriteTest</a>(org.apache.hadoop.hbase.client.Connection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html#line.1758">testRow</a>(int i)
+<pre>void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html#line.1852">testRow</a>(int 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 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 org.apache.hadoop.hbase.client.ResultScanner <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1790">testScanner</a></pre>
+<pre>private 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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1886">ScanTest</a>(org.apache.hadoop.hbase.client.Connection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1797">testTakedown</a>()
+<pre>void <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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1806">testRow</a>(int i)
+<pre>void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1900">testRow</a>(int 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 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 con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html#line.2036">SequentialReadTest</a>(org.apache.hadoop.hbase.client.Connection con,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> options,
<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> 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 <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html#line.1944">testRow</a>(int i)
+<pre>void <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html#line.2041">testRow</a>(int 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><E> (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><T>, 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><T>)</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><T>)</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><T>)</li>
</ul>
</li>
</ul>